2015-12-15 3 views
1

Я хочу изменить цвет Forground заголовка PivotItem при наведении курсора мыши с UWP, я работаю с окнами 10UWP - PivotItem мыши на изменение цвета

Я попробовал этот код:

<Page.Resources> 
     <SolidColorBrush x:Key="mouseOverColor" 
        Color="Red" /> 
    </Page.Resources> 
<Pivot HeaderTemplate="{StaticResource HeaderTemp}" VerticalAlignment="Top" HorizontalAlignment="Center" Margin="10,0,10,0"> 
      <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup> 
        <VisualState x:Name="Narrow"> 
         <VisualState.StateTriggers> 
          <AdaptiveTrigger MinWindowWidth="0" /> 
         </VisualState.StateTriggers> 
         <VisualState.Setters> 
          <Setter Target="Icon.(RelativePanel.AlignHorizontalCenterWithPanel)" Value="True" /> 
          <Setter Target="LabelText.(RelativePanel.Below)" Value="Icon" /> 
          <Setter Target="LabelText.(RelativePanel.AlignHorizontalCenterWith)" Value="Icon" /> 
         </VisualState.Setters> 
        </VisualState> 
        <VisualState x:Name="Wide"> 
         <VisualState.StateTriggers> 
          <AdaptiveTrigger MinWindowWidth="500" /> 
         </VisualState.StateTriggers> 
         <VisualState.Setters> 
          <Setter Target="Icon.(RelativePanel.AlignVerticalCenterWithPanel)" Value="True" /> 
          <Setter Target="LabelText.(RelativePanel.RightOf)" Value="Icon" /> 
          <Setter Target="LabelText.(RelativePanel.AlignVerticalCenterWith)" Value="Icon" /> 
          <Setter Target="RelativePanel.Margin" Value="0,0,12,0"/> 
          <Setter Target="Icon.Margin" Value="0,0,0,0"/> 
         </VisualState.Setters> 
        </VisualState> 
       </VisualStateGroup> 
      </VisualStateManager.VisualStateGroups> 
      <Pivot.Resources> 
       <Style x:Key="myStyle" TargetType="PivotItem"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="PivotItem"> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsMouseOver" 
        Value="True"> 
             <Setter Property="Background" 
        Value="{StaticResource mouseOverColor}" /> 
            </Trigger> 
           </ControlTemplate.Triggers> 
           <ContentPresenter /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </Pivot.Resources> 
      <PivotItem Header="/images/img.png" Margin="12,10,12,0" > 
       <Grid> 
        ..... 
       </Grid> 
      </PivotItem> 

I есть ошибка «Прикрепляемое свойство« Триггеры »не было найдено в типе« ControlTemplate » вы можете представить себе, как я могу изменить цвет изображения, когда мышь закончилась в универсальном приложении. спасибо за помощь

+1

Возможно, было бы проще создать две фотографии, сгруппировать их и показать/скрыть в соответствии с указателем мыши. Или сделайте один снимок, используйте прозрачный цвет для частей переднего плана, уложите его поверх прямоугольника и измените заливку прямоугольника на основе мыши. –

ответ

2

Вы хотите chan GE цвет изображения, я думаю, что это не может быть сделано в конструкторе XAML, вы можете сделать это следующим образом:

XAML код:

<Pivot> 
     <PivotItem> 
      <PivotItem.Header> 
       <Image x:Name="headerimg" Source="Assets/1.jpg" PointerEntered="pointerEntered" PointerExited="pointerExited"/> 
      </PivotItem.Header> 
     </PivotItem> 
    </Pivot> 

код ключа позади в .cs файла:

private async void pointerEntered(object sender, PointerRoutedEventArgs e) 
{ 
    StorageFile imgFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets\\1.jpg")); 
    using(IRandomAccessStream streamIn = await imgFile.OpenReadAsync()) 
    { 
     //decoder the img 
     BitmapDecoder decoder = await BitmapDecoder.CreateAsync(BitmapDecoder.JpegDecoderId, streamIn); 
     //get pixel 
     PixelDataProvider proved = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(), 
      ExifOrientationMode.IgnoreExifOrientation, ColorManagementMode.DoNotColorManage); 
     byte[] srcData = proved.DetachPixelData(); 

     // GRAYSCALE 
     for (int i = 0; i < srcData.Length; i += 4) 
     { 
      double b = srcData[i]; //B 
      double g = srcData[i + 1]; //G 
      double r = srcData[i + 2]; //R 
      //average 
      double v = (r + g + b)/3d; 
      //replace old rgb 
      srcData[i] = srcData[i + 1] = srcData[i + 2] = Convert.ToByte(v); 
     } 

     WriteableBitmap wbimg = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight); 
     srcData.CopyTo(wbimg.PixelBuffer); 
     this.headerimg.Source = wbimg; 
    } 

} 

private async void pointerExited(object sender, PointerRoutedEventArgs e) 
{ 
    StorageFile imgFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets\\1.jpg")); 
    IRandomAccessStream streamIn = await imgFile.OpenReadAsync(); 
    BitmapImage bitmap = new BitmapImage(); 
    bitmap.SetSource(streamIn); 
    this.headerimg.Source = bitmap; 
} 

Чтобы изменить цвет изображения, вам необходимо декодировать это изображение, получить его значения RGB, переписать эти значения и вернуть их обратно к изображению. И нет Foreground собственности для управления Image.

+0

благодарит GraceF за ваш ответ, у меня есть вопрос, пожалуйста, в вашем ответе только одно изображение, если у меня есть 4 изображения, поэтому я должен использовать массив, а затем применить декодирование на каждое изображение в массиве? – user3821206

+1

Используйте массив для чего? Вы имеете в виду использование массива для сбора адресов четырех изображений? Каждый раз, когда ваша мышь находится в заголовке, вы хотите изменить цвет четырех изображений вместе? Или каждый раз меняете одно изображение? Независимо от того, вы можете привязать этот код «changecolor» к функции и вызвать эту функцию каждый раз, когда вы получаете файл изображения. –

+0

ok спасибо GraceF, я буду использовать функцию, у меня есть 4 изображения, которые я хочу обернуть цвет изменения для каждого изображения – user3821206

Смежные вопросы