Datatrigger в стиле WPF: изменение содержимого не работает - PullRequest
0 голосов
/ 04 июля 2018

У меня есть некоторая кодировка стиля для пользовательского максимизации Button, и у меня возникают некоторые проблемы.

<Style TargetType="Button">
       <Setter Property="Template">
           <Setter.Value>
               <ControlTemplate TargetType="Button">
                   <Border Background="{TemplateBinding Background}" BorderThickness="0">
                       <ContentPresenter  Margin="10,7,10,7" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                   </Border>
               </ControlTemplate>
           </Setter.Value>
       </Setter>
       <Setter Property="Background" Value="#01000000"/>
       <Setter Property="Foreground" Value="#FFFFFFFF"/>
       <Setter Property="Margin" Value="0"/>
       <Style.Triggers>
           <Trigger Property="IsMouseOver" Value="True">
               <Setter Property="Background" Value="#50FFFFFF"/>
           </Trigger>
           <!--This trigger fails-->
           <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource FindAncestor, AncestorType=acrylic:AcrylicWindow}}" Value="Maximized">
               <Setter Property="Content">
                   <Setter.Value>
                       <Grid>
                           <Path Height="10" Width="10" Data="M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z"
                               Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}}"
                               StrokeThickness="1"
                               SnapsToDevicePixels="True"/>
                       </Grid>
                   </Setter.Value>
               </Setter>
           </DataTrigger>
           <!--It Works Correctly-->
           <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource FindAncestor, AncestorType=acrylic:AcrylicWindow}}" Value="Normal">
               <Setter Property="Content">
                   <Setter.Value>
                       <Grid>
                           <Path Width="10" Height="10" Data="F1M0,0L0,9 9,9 9,0 0,0 0,3 8,3 8,8 1,8 1,3z"
                             Fill="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
                             SnapsToDevicePixels="True"/>
                       </Grid>
                   </Setter.Value>
              </Setter>
          </DataTrigger>
      </Style.Triggers>
  </Style>

Когда значение Window максимизируется, содержимое Button исчезает, оно не показывает путь, оно пустое (но кликабельно и затухание в InMouseOver работает). Когда Window находится в нормальном состоянии, содержимое кнопки правильное. Я пытался изменить данные пути, но я не увидел никаких изменений.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Виновником является эта строка:

Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}}"

Причина этого заключается в том, что эта привязка не может быть разрешена при создании экземпляра сеттера, поскольку Path еще не существует.

Когда вы используете

Stroke="#FFFFFFFF"

вместо этого будет работать.

Определите цвет в ресурсе и используйте что-то вроде

Stroke="{StaticResource ButtonForegroundColor}"

для лучшей поддержки вашего кода XAML.

0 голосов
/ 04 июля 2018

Попробуйте определить контент как ресурс:

<Style TargetType="Button">
    <Style.Resources>
        <Grid x:Key="max">
            <Path Height="10" Width="10" Data="M2,0 L8,0 L8,6 M0,3 L6,3 M0,2 L6,2 L6,8 L0,8 Z"
                               Stroke="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Button}}}"
                               StrokeThickness="1"
                               SnapsToDevicePixels="True"/>
        </Grid>
        <Grid x:Key="normal">
            <Path Width="10" Height="10" Data="F1M0,0L0,9 9,9 9,0 0,0 0,3 8,3 8,8 1,8 1,3z"
                             Fill="{Binding Path=Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
                             SnapsToDevicePixels="True"/>
        </Grid>

    </Style.Resources>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border Background="{TemplateBinding Background}" BorderThickness="0">
                    <ContentPresenter  Margin="10,7,10,7" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Background" Value="#01000000"/>
    <Setter Property="Foreground" Value="#FFFFFFFF"/>
    <Setter Property="Margin" Value="0"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="#50FFFFFF"/>
        </Trigger>
        <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="Maximized">
            <Setter Property="Content" Value="{StaticResource max}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" Value="Normal">
            <Setter Property="Content" Value="{StaticResource normal}" />
        </DataTrigger>
    </Style.Triggers>
</Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...