0

我有以下按钮 XAML

<Button Name="btnLogoff" DockPanel.Dock="Left" Click="btnToolbar_Click" CommandParameter="LOGOFF"
                    Template="{DynamicResource ToolbarButton}"
                        Style="{StaticResource ToolbarButtonDisplay}" z:ButtonProperties.Image="..\..\Resources\Images\Logoff.GIF" Content="Logoff">
                </Button>

ButtonProperties如下

public class ButtonProperties
    {
        public static ImageSource GetImage(DependencyObject obj)
        {
            return (ImageSource) obj.GetValue(ImageProperty);
        } 

        public static void SetImage(DependencyObject obj, ImageSource value)
        {
            obj.SetValue(ImageProperty, value);
        } 

        public static readonly DependencyProperty ImageProperty = DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ButtonProperties), new UIPropertyMetadata((ImageSource)null));
    } 

效果很好,给我一个按钮模板,我可以在整个应用程序中使用具有图像和文本组件的按钮。

我想要做的是在某些后台线程方法上将样式从 ToolbarButton 动态更改为 ToolbarButtonRed,例如通知用户即将发生事件,按钮将变为红色样式。两种样式都在 XAML 页面的资源中,但我不知道如何以编程方式更改模板。

我努力了..

        public DataTemplate AlarmTemplate
        {
            get
            {
                if (_alarmTemplate != null)
                    return _alarmTemplate;
                else
                    return (DataTemplate)_parent.FindResource("ToolbarButton");
            }
            set
            {
                _alarmTemplate = value;
                OnPropertyChanged("AlarmTemplate");
            }
        }


private void SetAlarmIcon(bool red)
        {
            if (red)
                AlarmTemplate = (DataTemplate)_parent.FindResource("ToolbarButtonRed");
            else
                AlarmTemplate = (DataTemplate)_parent.FindResource("ToolbarButton");
        }

并像这样绑定 XAML

但没有喜悦。该按钮甚至根本不显示。有什么建议么?

更新:

下面的样式

<Style x:Key="ToolbarButtonDisplay" TargetType="Button">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Image Source="{Binding Path=(Windows:ButtonProperties.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Margin="0,2,0,0" Width="32"/>
                        <TextBlock FontSize="9" FontWeight="Normal" FontFamily="Arial" Foreground="White" HorizontalAlignment="Center" Margin="2,2,2,2">
                                <ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></ContentPresenter>
                        </TextBlock>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsEnabled}" Value="True">
                <Setter Property="Template" Value="{StaticResource ToolbarButtonRed}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

最终更新 - 我得到了一个触发器,如下所示

<Style.Triggers>
            <DataTrigger Binding="{Binding Path=DisplayToolbar}" Value="True">
                <Setter Property="Template" Value="{DynamicResource ToolbarButtonRed}"/>
            </DataTrigger>
        </Style.Triggers>

通过仅在数据上下文(DisplayToolbar)上使用任意属性,因为我不确定如何针对按钮执行此操作。解释一下,我在页面上有大约 30 个按钮,它们都使用相同的样式,因此使用相同的触发器,因此上面的代码会将所有 30 个设置为红色。我需要一种方法让每个按钮来锻炼 IT 和 IT ALONE 是否应该是红色的,所以我正在考虑设置按钮控件的某些属性(如果有一个我可以使用),并让数据触发器查看按钮属性,而不是数据上下文。绑定到按钮自身属性而不是数据上下文的语法是什么?

4

1 回答 1

0

它应该像将 Style 属性设置为 FindResource 中的值一样简单。

Dispatcher.Invoke(() => { btnLogoff.Style = (Style)FindResource("ToolbarButtonRed"); });

此处使用调度程序调用,因为您无法从后台线程设置控件的依赖项属性。

根据下面的评论,可以以完全相同的方式设置控件模板。

 Dispatcher.Invoke(() => { btnLogoff.Template = (ControlTemplate)FindResource("ToolbarButtonRed"); });
于 2012-11-06T16:50:46.580 回答