如何在运行时编辑WPF按钮

时间:2017-12-05 15:14:11

标签: wpf templates expression-blend

所以我使用Expression Blend来设计我的按钮。我创建了一个新按钮,通过删除按钮中的所有内容来编辑按钮的模板。然后我在其中添加了一个网格并命名为#34; grid"。在网格内部,我添加了一个文本块并将其称为" textBlock"。然后我在“应用程序”下保存了模板。

这是app.xaml文件中的内容。

<Style x:Key="CustomButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
        <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="grid" HorizontalAlignment="Left" Height="40" VerticalAlignment="Top" Width="90">
                        <TextBlock x:Name="textBlock" HorizontalAlignment="Left" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Margin="5,5,0,0" Height="25" Width="75" FontSize="17.333"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsDefaulted" Value="true"/>
                        <Trigger Property="IsMouseOver" Value="true"/>
                        <Trigger Property="IsPressed" Value="true"/>
                        <Trigger Property="IsEnabled" Value="false"/>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

基本上我打算做的是在运行时创建一个按钮,将这个样式应用于按钮,转到按钮的模板,然后更改按钮模板中文本块的text属性。

首先,对于初学者而言,我没有在运行时创建一个按钮,而是在编译时创建了一个按钮并命名为#34; customButton&#34;。然后我尝试编辑按钮模板的文本属性&#39;文本块,但遇到异常。

TextBlock tb = this.customButton.Template.FindName("textBlock", customButton) as TextBlock;
tb.Text = "ASDDDQWEQWEQWE";

请指教谢谢!

2 个答案:

答案 0 :(得分:1)

创建一个按钮模板,就像您拥有的那样,并为每个项目添加控件:

<ControlTemplate TargetType="{x:Type Button}">
                <StackPanel>
                    <Label Content="{Binding CompanyName}" />
                    <Image Source="{Binding Image}" />
                    <Label Content="{Binding StockChange}" />
                </StackPanel>
</ControlTemplate>

或者您可以将其添加到按钮内容中:

<Button>
    <Button.Content>
        <StackPanel>
            <Label Content="{Binding CompanyName}" />
            <Image Source="{Binding Image}" />
            <Label Content="{Binding StockChange}" />
        </StackPanel>
    </Button.Content>
</Button

创建class以保存API中的数据:

public class CompanyInfo 
{
    public string CompanyName;
    public ImageSource Image;
    public string StockChange;
}

在代码隐藏或viewmodel中创建ObservableCollection<CompanyInfo>以保存从API数据创建的CompanyInfo个对象:

public ObservableCollection<CompanyInfo> CompanyInfoList = new ObservableCollection<CompanyInfo>();

创建ItemsControl以从数据列表中创建按钮:

<ItemsControl ItemsSource="{Binding Path=CompanyInfoList}">

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
        <DataTemplate>

            //Button with Bindings Goes Here

        </DataTemplate>
    </ItemsControl.ItemTemplate>

</ItemsControl>

和你的叔叔一样。我建议研究其中的一些内容,以便更好地理解它是如何工作的。

答案 1 :(得分:1)

  

我想创建一个代表公司股票信息的按钮   公司名称,形象和股票价格的百分比增加在一起   单按钮。因此,在运行时,生病从一个人获得前十大股票   外部API并在运行时使用信息创建10个按钮   将其添加到主窗口的堆栈面板中。

您需要将ListBox和ItemTempate用于此类场景。 请尝试以下代码。

tsc <filename>.ts