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>

ボタンのプロパティは次のとおりです

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>

ボタンに固有の方法がわからないため、datacontext(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 に答える