用于在代码中重用的模板按钮

本文关键字:按钮 代码 用于 | 更新日期: 2023-09-27 18:16:00

我很抱歉,如果这是非常明显的,但是我已经使用c#很多年了,我似乎找不到正确的谷歌搜索词。

我试图在XAML中创建一个按钮模板,将用于一个,例如,2x2网格。这个按钮必须添加到代码中,因为用户应该能够在运行时定义他想要多少按钮。按钮应该包含另一个按钮和一个标签。

<Window x:Class="Soundboard.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="750" Width="1200">
<Window.Resources>
    <ControlTemplate x:Key="myButton" TargetType="Button">
            <Canvas x:Name="mainCanvas">
            <Button x:Name="childButton" Height="30" Width="30" HorizontalAlignment="Right" VerticalAlignment="Top">
                <Button.Background>
                    <ImageBrush ImageSource="Resources/picture.png"/>
                </Button.Background>
            </Button>
            <Label x:Name="nameLabel" Content="Label" HorizontalAlignment="Center" VerticalAlignment="Bottom"></Label>
            </Canvas>
    </ControlTemplate>
</Window.Resources>
<Grid x:Name="myGrid">
</Grid>

我可以通过在XAML myGrid (to test)

中添加这一行来调用按钮
    <Button Template="{StaticResource myButton}" Height="200" Width="200" Margin="300,0,0,0"></Button>
    <Button Template="{StaticResource smyButton}" Height="200" Width="200" Margin="0,0,0,0"></Button>

但是我似乎无法找到在代码中添加按钮的方法。这是我的一个不工作的尝试:

Button b = (Button)FindResource("myButton");
b.SetValue(Grid.RowProperty, r); // r is int from row for loop
b.SetValue(Grid.ColumnProperty, c); // c is int from column for loop
myGrid.Children.Add(b);

但是b总是空的。有人能帮帮我吗?我猜我在XAML中使用了一些错误的方法,但我现在真的不知道。

用于在代码中重用的模板按钮

myButton是一个ControlTemplate,而不是当前在代码中访问的Button,因此您可以修改代码如下

Button b = new Button();
b.Template = (ControlTemplate)FindResource("myButton");

所以在上面的例子中,你通过FindResource方法检索ControlTemplate并将其应用于新创建的按钮。

其余部分保持不变

就像这一行,它已经被用于app.xaml文件:

  <ResourceDictionary.ThemeDictionaries> 
            <ResourceDictionary x:Key="Default"> 
                <SolidColorBrush x:Key="ListBoxItemDisabledForegroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxItemPointerOverBackgroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxItemPointerOverForegroundThemeBrush" Color="#f7f6f6" /> 
                <SolidColorBrush x:Key="ListBoxItemPressedBackgroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxItemPressedForegroundThemeBrush" Color="#f7f6f6" /> 
                <SolidColorBrush x:Key="ListBoxItemSelectedBackgroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxItemSelectedDisabledBackgroundThemeBrush" Color="#66FFFFFF" /> 
                <SolidColorBrush x:Key="ListBoxItemSelectedDisabledForegroundThemeBrush" Color="#99000000" /> 
                <SolidColorBrush x:Key="ListBoxItemSelectedForegroundThemeBrush" Color="#f7f6f6" /> 
                <SolidColorBrush x:Key="ListBoxItemSelectedPointerOverBackgroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxBackgroundThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxBorderThemeBrush" Color="Transparent" /> 
                <SolidColorBrush x:Key="ListBoxDisabledForegroundThemeBrush" Color="#66FFFFFF" /> 
                <SolidColorBrush x:Key="ListBoxFocusBackgroundThemeBrush" Color="#f7f6f6" /> 
                <SolidColorBrush x:Key="ListBoxForegroundThemeBrush" Color="#f7f6f6" /> 
            </ResourceDictionary>