2016-09-26 4 views
1

Я использую MahAppsMetro, и поэтому у меня есть ResourceDictionary, где я могу изменить цвет дизайна. Теперь я изменил цвет на синий. Но я не знаю, как изменить textcolorselected item на combobox/table. Похоже, это сейчас:Изменение Combobox/Table Item textcolor на Mouseover в ResourceDictionary

Example: Combobox

Example: Table

Так что теперь я хочу, чтобы изменить TextColor белым по ResourceDictionary .. Это выглядит примерно так же:

<!-- re-set brushes too --> 
<SolidColorBrush x:Key="HighlightBrush" Color="{StaticResource HighlightColor}" options:Freeze="True" /> 
<SolidColorBrush x:Key="AccentColorBrush" Color="{StaticResource AccentColor}" options:Freeze="True" /> 
<SolidColorBrush x:Key="AccentColorBrush2" Color="{StaticResource AccentColor2}" options:Freeze="True" /> 
<SolidColorBrush x:Key="AccentColorBrush3" Color="{StaticResource AccentColor3}" options:Freeze="True" /> 
<SolidColorBrush x:Key="AccentColorBrush4" Color="{StaticResource AccentColor4}" options:Freeze="True" /> 

<SolidColorBrush x:Key="WindowTitleColorBrush" Color="{StaticResource AccentColor}" options:Freeze="True" /> 

<LinearGradientBrush x:Key="ProgressBrush" EndPoint="0.001,0.5" StartPoint="1.002,0.5" options:Freeze="True"> 
    <GradientStop Color="{StaticResource HighlightColor}" Offset="0" /> 
    <GradientStop Color="{StaticResource AccentColor3}" Offset="1" /> 
</LinearGradientBrush> 

<SolidColorBrush x:Key="CheckmarkFill" Color="{StaticResource AccentColor}" options:Freeze="True" /> 
<SolidColorBrush x:Key="RightArrowFill" Color="{StaticResource AccentColor}" options:Freeze="True" /> 

Можете ли вы рассказать мне, что мне нужно добавить в свой ресурс ResourceDictionary, чтобы иметь белый текст в MouseOver элементов.

Надеюсь, что я хочу делать. Еще скажите, пожалуйста, какую дополнительную информацию вам нужно.

редактировать:

Для Combobox это работает в настоящее время. Но не для DataGrid. Вот как я добавил DataGrid:

<DataGrid x:Name="mydatagrid" SelectionUnit="FullRow" HorizontalAlignment="Left" Margin="159,33,0,0" VerticalAlignment="Top" Height="204" Width="275" Background="{x:Null}" BorderBrush="Transparent" CanUserAddRows="False" GridLinesVisibility="None" BorderThickness="0" CanUserResizeRows="False"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="User" Binding="{Binding User, Mode=OneWay}" Width="100" IsReadOnly="True" CanUserResize="False" /> 
         <DataGridTextColumn Header="Vote" Binding="{Binding Vote, Mode=OneWay}" Width="90" IsReadOnly="True" CanUserResize="False" /> 
         <DataGridTemplateColumn Header="Status" Width="66" IsReadOnly="True" CanUserResize="False"> 
          <DataGridTemplateColumn.CellTemplate> 
           <DataTemplate> 
            <Image Source="{Binding Status, Mode=OneWay}" Width="16"/> 
           </DataTemplate> 
          </DataGridTemplateColumn.CellTemplate> 
         </DataGridTemplateColumn> 
         <DataGridTextColumn Header="Real_Username" Binding="{Binding Real_Username, Mode=OneWay}" Width="90" IsReadOnly="True" CanUserResize="False"/> 
        </DataGrid.Columns> 
       </DataGrid> 

Я пытался добавить различные методы для моей Application.xaml и расширил триггера IsMouseOver с:

<Setter Property="Controls.Foreground" Value="{DynamicResource AccentSelectedColorBrush}" /> 

Что я делаю неправильно?

+0

Я никогда не пробовал это сам, но я бы предложил посмотреть триггеры: http://www.wpf-tutorial.com/styles/trigger-datatrigger-event-trigger/ – MikeT

ответ

0

можно, но для MouseOver вам необходимо переопределить ComboBoxItem MahApps и расширить его с помощью триггера. В SelectedItem используется ColorBrush: AccentSelectedColorBrush. Вот оригинал MetroComboBoxItem удлинен с помощью триггера для MouseOver

App.xaml

<Application x:Class="WpfApplication.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 
<ResourceDictionary> 
    <ResourceDictionary.MergedDictionaries> 
    <!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! --> 
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> 
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> 
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> 
    <!-- Accent and AppTheme setting --> 
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" /> 
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 

    <SolidColorBrush x:Key="AccentSelectedColorBrush" Color="DeepPink" /> 
    <Style TargetType="ComboBoxItem" x:Key="MetroComboBoxItem"> 
    <Setter Property="Foreground" Value="{DynamicResource TextBrush}" /> 
    <Setter Property="Padding" Value="2" /> 
    <Setter Property="HorizontalContentAlignment" Value="Left" /> 
    <Setter Property="VerticalContentAlignment" Value="Top" /> 
    <Setter Property="Background" Value="{DynamicResource TransparentWhiteBrush}" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBoxItem"> 
       <Grid Background="{TemplateBinding Background}" Margin="0,0.5"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal" /> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 
                    Storyboard.TargetName="MouseOverRectangle"> 
             <EasingDoubleKeyFrame KeyTime="0:0:0.1" 
                   Value=".65" /> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" 
                    Storyboard.TargetName="contentPresenter"> 
             <SplineDoubleKeyFrame KeyTime="0" 
                   Value=".55" /> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" 
                    Storyboard.TargetName="SelectedRectangle"> 
             <EasingDoubleKeyFrame KeyTime="0:0:0.1" 
                   Value="1" /> 
            </DoubleAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="FocusStates"> 
          <VisualState x:Name="Focused"> 
           <Storyboard /> 
          </VisualState> 
          <VisualState x:Name="Unfocused" /> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Rectangle x:Name="SelectedRectangle" 
           IsHitTestVisible="False" 
           Opacity="0" 
           Fill="{DynamicResource AccentColorBrush}" /> 
        <Rectangle x:Name="MouseOverRectangle" 
           IsHitTestVisible="False" 
           Opacity="0" 
           Fill="{DynamicResource AccentColorBrush3}" /> 
        <ContentControl Foreground="{TemplateBinding Foreground}"> 
         <ContentPresenter x:Name="contentPresenter" 
              Margin="{TemplateBinding Padding}" 
              VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" /> 
        </ContentControl> 
        <Rectangle x:Name="FocusVisualElement" 
           Stroke="{DynamicResource HighlightBrush}" 
           StrokeThickness="1" 
           Visibility="Collapsed" /> 
       </Grid> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Foreground" Value="{DynamicResource AccentSelectedColorBrush}" /> 
        </Trigger> 
        <!-- This Trigger is new --> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Foreground" Value="{DynamicResource AccentSelectedColorBrush}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </ResourceDictionary> 
    </Application.Resources> 
</Application> 
+0

спасибо за ваш ответ. Я просто искал часть кода, которую вы предоставили, и нашел его, когда я открыл DLL с помощью ILSpy. Итак, я думаю, что нашел правильную точку, где нужно делать изменения. К сожалению, я не знаю, как изменить его. С помощью ILSpy я могу только прочитать его. Можете ли вы или кто-нибудь объяснить мне, как изменить эту часть в DLL-файле? Или я ошибаюсь, что хочу делать? –

+0

Почему бы вам не добавить фрагмент кода к вашему Window.Resources? Тогда это будет сделано. Изменение dll не требуется. Второй вариант заключается в изменении источников (загрузка источников из MahApps в GitHub https://github.com/MahApps/MahApps.Metro и изменение Controls.ComboBox.xaml) напрямую (вы можете добавить стиль с помощью триггера) и скомпилировать ваши own MahApps.dll – WPFGermany

+0

У меня есть несколько окон, и я использую несколько списков со списком. Поэтому я хочу изменить его только на одну точку для всех combobox. Вот почему я предпочел бы второй вариант. Я уже загрузил источники, открыл его в Visual Studio и нашел нужное место для добавления моего изменения - но он показывает ошибку «Имя« TextBoxHelper »не существует в пространстве имен« пространство имен clr: MahApps.Metro.Controls »" , Поэтому я не могу скомпилировать свою собственную dll. Любая идея, что я делаю неправильно? –

0

Для DataGrid легко:

если вы любите стиль всей линии клеток, OnMouseOver или IsSelected использование этого :

<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
    <Setter Property="Foreground" Value="Green" /> 
     <Style.Triggers> 
      <!-- Full Row --> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=IsMouseOver}" Value="True"> 
       <Setter Property="Foreground" Value="Red" /> 
       <Setter Property="Opacity" Value="0.8" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=IsSelected}" Value="True"> 
       <Setter Property="Foreground" Value="DeepPink" /> 
       <Setter Property="Opacity" Value="0.3" /> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

Клетки только это:

<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 
    <Setter Property="Foreground" Value="Green" /> 
     <Style.Triggers> 
      <!-- Cell only --> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"> 
       <Setter Property="Foreground" Value="Red" /> 
        <Setter Property="Opacity" Value="0.8" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"> 
       <Setter Property="Foreground" Value="DeepPink" /> 
       <Setter Property="Opacity" Value="0.3" /> 
      </DataTrigger> 
     </Style.Triggers> 
</Style> 

Вы можете разместить Style в своем приложении.xaml для работы со всем вашим приложением.

+0

Я думаю, что я хотел сделать это сложным. Ваше решение работает очень хорошо для меня. Спасибо! Но есть еще один вопрос, который у меня есть - возможно ли уменьшить непрозрачность для этой строки? Так что он немного легче, чем тот, который выбран? Я просто попытался использовать фрагмент кода из другого ответа, где непрозрачность уменьшена, но это не сработало ... –

+0

См. Обновленный ответ. и не забывайте поднимать ответы! – WPFGermany

+0

Хорошо - возможно ли просто изменить непрозрачность фона? Теперь он изменяется для всей строки (Fore and Backrgound) И еще одна проблема: у меня разные файлы Style.xaml, где я устанавливаю разные цвета. Во время выполнения я могу изменить их и заменить их в application.xaml, но когда я это сделаю, значение Foregroundcolor не будет обновляться - оно всегда остается таким же, как оно было определено в файле xaml, который загружается первым. –

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