1

次のように設定したボタンがいくつかあります。

<Button Template="{DynamicResource btnTmplt}" Command="{Binding ImgChgeCmd}" >
  <Button.Resources>
  <ControlTemplate x:Key="btnTmplt" TargetType="{x:Type Button}">
    <StackPanel x:Name="stPanel" HorizontalAlignment="Left" Width="Auto" 
                Height="Auto" Orientation="Horizontal">
    <Image x:Name="img" Source=""></Image>
    </StackPanel>
      <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
          <Trigger.Setters>
            <Setter TargetName="img" Property="Source" 
Here--------->      Value="{Binding FirstImage, Converter={StaticResource GrayScaleConverter}}" />
            <Setter TargetName="stPanel" Property="BitmapEffect">
              <Setter.Value>
                <BlurBitmapEffect Radius="1" />
              </Setter.Value>
            </Setter>
          </Trigger.Setters>
        </Trigger>
        <Trigger Property="IsEnabled" Value="True">
          <Trigger.Setters>
And Here--> <Setter TargetName="img" Property="Source" Value="{Binding FirstImage}" />
            <Setter TargetName="stPanel" Property="BitmapEffect" Value="{x:Null}" />
          </Trigger.Setters>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
  </Button.Resources>
</Button>

Button.Resources セクションは、これらすべてのボタンでほぼ同じです。異なる 2 行は、上記の「Here--->」で示される値バインディングです。

これらの違いにより、ボタンごとに異なる画像を読み込むことができます。

ボタンごとに Button.Resources を複製する必要がないように、これを設定する方法はありますか? (ただし、各ボタンに異なる画像をロードします)。

4

1 に答える 1

0

カスタム コントロールを作成できます。簡単な例を示しましたが、コントロールをカスタマイズして好きなように動作させることができます (非常に強力です)。また、BitMapEffects は非推奨になっていることに注意してください。.net 4 で使用しようとすると、例外が発生します。とにかく...次のようなカスタム コントロールを作成します。

public class VaccanoButton : Button
{        
    static VaccanoButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(VaccanoButton), new FrameworkPropertyMetadata(typeof(VaccanoButton)));
    }

    public ImageSource FirstImage
    {
        get { return (ImageSource)GetValue(FirstImageProperty); }   
        set { SetValue(FirstImageProperty, value); }
    }

    // Using a DependencyProperty as the backing store for FirstImage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty FirstImageProperty =
        DependencyProperty.Register("FirstImage", typeof(ImageSource), typeof(VaccanoButton), new UIPropertyMetadata(null));  
}

Generic.xaml で xaml を次のように設定します。

<Style TargetType="{x:Type local:VaccanoButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:VaccanoButton}">
                <Button>
                    <StackPanel x:Name="stPanel" HorizontalAlignment="Left" Width="Auto"  
                Height="Auto" Orientation="Horizontal">
                        <Image x:Name="img"></Image>
                    </StackPanel>
                </Button>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="img" Property="Source" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FirstImage}" />
                            <Setter TargetName="stPanel" Property="BitmapEffect">
                                <Setter.Value>
                                    <BlurBitmapEffect Radius="1"  />
                                </Setter.Value>
                            </Setter>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="True">
                        <Trigger.Setters>
                            <Setter TargetName="img" Property="Source" Value="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=FirstImage}" />
                            <Setter TargetName="stPanel" Property="BitmapEffect" Value="{x:Null}" />
                        </Trigger.Setters>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

そしてそれを次のように使用します:

        <local:VaccanoButton FirstImage="\Untitled.png"/>
于 2012-07-04T02:22:34.623 に答える