0

後で実装コントロールによって値を割り当てることができる WPF スタイルでPlaceHolderを使用することは可能ですか? 何かのようなもの:

<Style x:Key="BigButton" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="#58290a" />
    <Setter Property="FontFamily" Value="Lucida Console" />
    <Setter Property="FontSize" Value="24" />
    <Setter Property="Content">
        <Setter.Value>
            <StackPanel>
                <Image Source=[SOME PLACEHOLDER]></Image>
                <TextBlock>[ANOTHER PLACEHOLDER]</TextBlock>
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>

ボタンは、次のようにこのプレースホルダーに画像パスを割り当てることができます。

<Button Name="btn" Style="{StaticResource BigButton}">
    <SOME CLEVER WAY OF ASSIGNING A PATH TO Style.Content.StackPanel.Image.Source and Style.Content.StackPanel.TextBlock.Text>
</Button>
4

2 に答える 2

1

これはAttached propertiesの仕事のように思えます。

「プレースホルダー プロパティ」を使用してユーティリティ クラスを作成します。

public static class BigButtonUtils
{
    public static Uri GetBBImage(DependencyObject obj)
    {
        return (Uri)obj.GetValue(BBImageProperty);
    }
    public static void SetBBImage(DependencyObject obj, Uri value)
    {
        obj.SetValue(BBImageProperty, value);
    }
    // Using a DependencyProperty as the backing store for BBImage.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BBImageProperty =
        DependencyProperty.RegisterAttached("BBImage", typeof(Uri), typeof(BigButtonUtils), new UIPropertyMetadata(null));


    public static string GetBBCaption(DependencyObject obj)
    {
        return (string)obj.GetValue(BBCaptionProperty);
    }
    public static void SetBBCaption(DependencyObject obj, string value)
    {
        obj.SetValue(BBCaptionProperty, value);
    }
    // Using a DependencyProperty as the backing store for BBCaption.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty BBCaptionProperty =
        DependencyProperty.RegisterAttached("BBCaption", typeof(string), typeof(BigButtonUtils), new UIPropertyMetadata(null));
}

これらのプロパティを Button に適用します。

<Button Style="{StaticResource BigButtonStyle}"
        bb:BigButtonUtils.BBImage="http://programming.enthuses.me/1.png" 
        bb:BigButtonUtils.BBCaption="My caption" />

..そして、Style でプロパティ値を使用します。

<Style x:Key="BigButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="#58290a" />
    <Setter Property="FontFamily" Value="Lucida Console" />
    <Setter Property="FontSize" Value="24" />
    <Setter Property="Content">
        <Setter.Value>
            <StackPanel DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Button}}">
                <Image Source="{Binding Path=(bb:BigButtonUtils.BBImage)}" Stretch="None" />
                <TextBlock Text="{Binding Path=(bb:BigButtonUtils.BBCaption)}" />
            </StackPanel>
        </Setter.Value>
    </Setter>
</Style>

注:スタイルの「プレースホルダー コンテンツ」をオーバーライドするため、ボタンに<Button Content="..." />やなどの他のコンテンツを設定しないでください。<Button ...>SomeContent</Button>

于 2013-01-08T19:31:38.583 に答える
0

プロパティをプレースホルダーとして使用できます。

    <Style x:Key="BigButton" TargetType="{x:Type Button}">
        <Setter Property="Foreground" Value="#58290a" />
        <Setter Property="FontFamily" Value="Lucida Console" />
        <Setter Property="FontSize" Value="24" />
        <Setter Property="Content">
            <Setter.Value>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Placeholder}"></TextBlock>
                </StackPanel>
            </Setter.Value>
        </Setter>
    </Style>

プロパティ:

    public string _placeholder;
    public string Placeholder
    {
        get
        {
            return _placeholder;
        }
        set
        {
            _placeholder = value;
            OnPropertyChanged("Placeholder");
        }
    }

OnClick-EventHandler や Command などを使用して、必要に応じてこのプロパティを変更できるようになりました。

于 2013-01-08T14:30:16.893 に答える