0

好的,我已经为Buttons我想在我的应用程序中使用的新样式。一般的想法是有 10 个方格Button,我将在其中有 aImage和在此下方 a TextBlock。我的问题是我想为每个设置我的Image.Source和我的TextBlock.Text不同Button。我在做什么是这样的:

<ControlTemplate TargetType="{x:Type Button}">

<Border x:Name="Border" CornerRadius="5" BorderThickness="1" Background="Gray" BorderBrush="Orange">
   <Grid>
     <Grid.RowDefinitions>
       <RowDefinition Height="Auto"/>
       <RowDefinition Height="*"/>
     </Grid.RowDefinitions>
        <Image Margin="0,5,0,0" Grid.Row="0" Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
     <TextBlock FontSize="12"/>
   </Grid>
</Border>

我应该怎么做才能发挥我这样的风格?

<Button Style="{DynamicResource MenuButtons}" Text="????" x:Name="LiveB" Source="????" Click="Live_Click"/>

提前致谢。

4

2 回答 2

2

如果您.Tag需要一张图片和一些文字,您可以使用按钮的and使其工作(错误).Content

<Style x:Key="MenuButtons" ...

    ...
    <ControlTemplate TargetType="{x:Type Button}" >
        <Border x:Name="Border" CornerRadius="5" BorderThickness="1" Background="Gray" BorderBrush="Orange">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Image Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"
                       Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" />
                <TextBlock FontSize="12" Text="{TemplateBinding Content}" Grid.Row="1" />
            </Grid>
        </Border>
    </ControlTemplate>
    ...

..接着:

<Button Style="{DynamicResource MenuButtons}" x:Name="LiveB" 
        Content="MyText la la la..." Tag="http://programming.enthuses.me/1.png" 
        Click="Live_Click" />

如果您需要更多自定义内容,您需要查看 Konstantin Zhukov 的评论和Attached Properties.

(为什么你不能只使用"{TemplateBinding Tag}"而不是"...{RelativeSource TemplatedParent}..."?我不知道,但TemplateBinding通常是一个非常脆弱的捷径,并不总是做它应该做的事情......)

于 2013-08-04T00:10:17.997 回答
1

您需要做的是创建一个类,它将充当 DataContext 到按钮

Class ButtonDataContext
{
    public String TextBlockText {get;set;}
    public String ImageSource {get;set;}
}

然后做

LiveB.DataContext = new ButtonDataContext(){TextBlockText = "text", ImageSource = "Image Path"};

在控制模板 XAML

<Image Source="{Binding Path=ImageSource}" Margin="0,5,0,0" Grid.Row="0" Width="25"  Height="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding Path=TextBlockText}" FontSize="12"/>
于 2013-08-03T18:19:26.843 回答