DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WPFでスタイル内の値の変更について

環境/言語:[Windows Xp、C#(WPF)、.NET Framework 3.5]
分類:[.NET]

WPFのButtonについて質問があります。
XAML側でButtonの外観を名前つきスタイルで定義して
ボタンの中にイメージと文字をセットしたいと思っています。

XAMLコードは以下のようなリストです。

<!--ボタンSTYLEの定義 -->
<Style x:Key="BtnStyle" TargetType="{x:Type Button}" BasedOn="{x:Null}">
<Setter Property="FocusVisualStyle" Value="{DynamicResource SimpleButtonFocusVisual}"/>
<Setter Property="Background" Value="{DynamicResource NormalBrush}"/>
<Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">

<Grid x:Name="Grid" Width="215" Height="85" ShowGridLines="False" HorizontalAlignment="Left" VerticalAlignment="Top">

<Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" Stroke="#FF000099" Width="200" Height="70" RadiusY="6" RadiusX="6" Grid.IsSharedSizeScope="False" ScrollViewer.CanContentScroll="False" x:Name="rectangle">
<Rectangle.BitmapEffect>
<DropShadowBitmapEffect Opacity="0.5" ShadowDepth="4"/>
</Rectangle.BitmapEffect>
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.5,-0.09" StartPoint="0.5,1.52">
<GradientStop Color="#FFAFAFAF" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Margin="62,21,-2,21" TextWrapping="Wrap" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" x:Name="textBlock">
<TextBlock.BitmapEffect>
<DropShadowBitmapEffect Color="#FFFFFFFF" ShadowDepth="2" Softness="0" Direction="325" Opacity="1"/>
</TextBlock.BitmapEffect>
<Run FontSize="18" FontWeight="Medium" Text="ボタン名称" Language="ja-jp"/></TextBlock>
<Image Margin="12,19,0,19.5" Width="40" Height="40" Source="c:\ImgDefault.png" HorizontalAlignment="Left" x:Name="image">
<Image.BitmapEffect>
<DropShadowBitmapEffect Opacity="0.5" ShadowDepth="3"/>
</Image.BitmapEffect>
</Image>

</Grid>

<ControlTemplate.Triggers>
<Trigger Property="IsKeyboardFocused" Value="true"/>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BitmapEffect" TargetName="image">
<Setter.Value>
<OuterGlowBitmapEffect GlowColor="#FF000099" Opacity="0.7"/>
</Setter.Value>
</Setter>
<Setter Property="ClipToBounds" TargetName="image" Value="False"/>
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Margin" TargetName="textBlock" Value="63,23,-2.333,20.001"/>
<Setter Property="Margin" TargetName="rectangle" Value="1,2,1.167,0.001"/>
<Setter Property="BitmapEffect" TargetName="rectangle">
<Setter.Value>
<DropShadowBitmapEffect Opacity="0.5" ShadowDepth="2"/>
</Setter.Value>
</Setter>
<Setter Property="BitmapEffect" TargetName="image">
<Setter.Value>
<OuterGlowBitmapEffect GlowColor="#FF000099" Opacity="0.7"/>
</Setter.Value>
</Setter>
<Setter Property="Margin" TargetName="image" Value="13,21,0,17.75"/>
</Trigger>
<Trigger Property="IsEnabled" Value="true"/>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

:

<Grid>
<Button Style="{StaticResource BtnStyle}" Name="btnTest1" Click="btnTest1_Click">
<Button Style="{StaticResource BtnStyle}" Name="btnTest2" Click="btnTest2_Click">
<Button Style="{StaticResource BtnStyle}" Name="btnTest3" Click="btnTest3_Click">
</Grid>


ここで質問なのですが、このままの状態だと当然ながら上記3つの
button(btnTest1〜btnTest3)の外観は全て同じイメージ(c:\ImgDefault.png)と
文字(「ボタン名称」)になってしまいます。

C#のコードの記述(初期処理)でスタイルの中のイメージの参照先と文字の内容を
可変的に変更することは可能なのでしょうか?
例えば、
  btnTest1 のイメージは「c:\Image1.jpg」、文字列は「○○処理」
  btnTest2 のイメージは「c:\Image2.jpg」、文字列は「××処理」
  btnTest1 のイメージは「c:\Image3.jpg」、文字列は「▲▲処理」
といった具合に変更したいのです。

目的はメニュー画面でボタンの配置が決められており、メニュー構成用のマスタより
ボタンの名称、イメージをセットしようと考えております。
Run は Binding 使えなかったはずなので面倒ですが、
これくらいなら Text プロパティで代用できそう。

XAML の TextBlock と Image はちょっと変更。
<TextBlock Text="{Binding Path=Text}"" x:Name="textBlock">
  <!-- 略。Run 要素は削除 -->
</TextBlock>
<Image Source="{Binding Path=Image}" x:Name="image">
  <!-- 略 -->
</Image>

コードで、
ButtonContent クラスを用意して Text プロパティと Image プロパティを定義。
各ボタンの DataContext に希望の Text 及び Image を持った ButtonContent を設定。

みたいな感じでどうでしょう。
Hongliangさんありがとうございました。

思った以上に簡単にできてびっくりしました。
解決済みをチェックし忘れました。
すみません。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板