以下のボタン 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 を赤くするかどうかを判断する方法が必要なので、使用できるボタン コントロールがあればボタン コントロールのプロパティを設定し、データ トリガーでボタンのプロパティであり、データコンテキストではありません。データコンテキストではなく、ボタン自体のプロパティにバインドする構文は何ですか?