WPF - настраиваемый стиль окна и использование изображения для минимизации, максимизации и закрытия кнопки, запускаемой различными данными - PullRequest
1 голос
/ 08 апреля 2020

Я хочу использовать настроенный стиль окна и использовать изображение для кнопок «Свернуть», «Развернуть», «Обычный» и «Закрыть».

Теперь я надеюсь, что когда WindowState развернуто, отобразить изображение «Развернуть» (из ресурса).

Когда WindowState имеет значение Normal, показывать обычное изображение (из ресурса).

Xaml ниже:

<Button Height="42" Width="42" Background="Transparent" BorderBrush="Transparent" Click="Button_Maximize_Click">
                    <Button.Style>
                        <Style TargetType="Button">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding WindowState}" Value="Maximized">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Maximize.png" Stretch="Uniform"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                                <DataTrigger Binding="{Binding WindowState}" Value="Normal">
                                    <Setter Property="Background">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Restore.png" Stretch="Uniform"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Button.Style>
                    <Button.ToolTip>
                        <ToolTip Style="{StaticResource ToolTipStyle}">Maximize or Restore</ToolTip>
                    </Button.ToolTip>
                </Button>

Событие Button_Maximize_Click:

private void Button_Maximize_Click(object sender, RoutedEventArgs e)
        {
            this.WindowState = (this.WindowState != WindowState.Maximized) ? WindowState.Maximized : WindowState.Normal;
        }

Но это не так показать изображение, что бы я ни нажимал кнопку или нет.

enter image description here

Пожалуйста, помогите мне, спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Не устанавливайте свойство Background напрямую. Вместо этого вы должны указать значение по умолчанию в Style установщике:

<Button Height="42" Width="42" BorderBrush="Transparent" Click="Button_Maximize_Click">
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Background" Value="Transparent" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding WindowState}" Value="Maximized">
                    <Setter Property="Background">
                        <Setter.Value>
                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Maximize.png" Stretch="Uniform"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding WindowState}" Value="Normal">
                    <Setter Property="Background">
                        <Setter.Value>
                            <ImageBrush ImageSource="/AccuPick3D;component/Image/Restore.png" Stretch="Uniform"/>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
    <Button.ToolTip>
        <ToolTip Style="{StaticResource ToolTipStyle}">Maximize or Restore</ToolTip>
    </Button.ToolTip>
</Button>

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

Вы также должны убедиться, что ваши привязки работают. Если вы не установили DataContext на this, вы должны установить свойство RelativeSource привязок, например, для привязки к свойству родительского окна:

Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
...