【问题标题】:Issue to Change button value dynamically in wpf在 wpf 中动态更改按钮值的问题
【发布时间】:2012-07-06 07:39:39
【问题描述】:
<Grid x:Name="LayoutRoot">
    <Button x:Name="btn_num" Width="51"  Margin="318.849,158,262.15,0" Height="45" VerticalAlignment="Top" d:LayoutOverrides="HorizontalMargin">
        <Grid Height="38.166" Width="44.833">
            <Label x:Name="lbl_2" Content="2" Margin="4.483,-2.042,7,-1.626" FontSize="11.333"/>
            <Label x:Name="lbl_1" Content="1" Margin="4.483,0,7,-19.251" FontSize="11.333" Height="41.834" VerticalAlignment="Bottom"/>
            <Label x:Name="lbl_3" Content="3" Margin="0,8.083,-15,-11.751" FontSize="11.333" HorizontalAlignment="Right" Width="33.35" Foreground="Black"/>
        </Grid>
    </Button>
    <Button x:Name="btn_a" Content="A" HorizontalAlignment="Left" Margin="225.333,158,0,0" Width="55" Foreground="Black" Height="45" VerticalAlignment="Top" Click="btn_alt_Click" />
</Grid>

它的设计会是这样的

public partial class button : Window
{
    static int _AClick = 0;
    public button()
    {
        this.InitializeComponent();     
    }

    private void btn_alt_Click(object sender, RoutedEventArgs e)
    {
        if (_AClick == 0)
        {
            _AClick = 1;
            Fill();
        }
        else
        {
            btn_num.Content = "";
            _AClick = 0;
        }
    }

    public void Fill()
    {
        btn_num.Content = "3";
    }
}

窗口加载后的结果

如果我点击A按钮第一次。结果会是这样的

如果我点击A按钮第二次。结果会是这样的

当我点击A按钮第二次。我需要如下结果。我该怎么做呢。

【问题讨论】:

    标签: c# .net wpf button


    【解决方案1】:

    WPF 中有很多方法可以实现这一点。一种方法是使用两个ControlTemplates(一个具有所有三个数字,另一个只有一个数字),然后在代码中设置按钮的模板-

    <Grid x:Name="LayoutRoot">  
        <Grid.Resources>
            <ControlTemplate
                x:Key="threeNumberTemplate"
                TargetType="{x:Type Button}">
                <Grid Height="38.166" Width="44.833"> 
                    <Label x:Name="lbl_2" Content="2" Margin="4.483,-2.042,7,-1.626" FontSize="11.333"/> 
                    <Label x:Name="lbl_1" Content="1" Margin="4.483,0,7,-19.251" FontSize="11.333" Height="41.834" VerticalAlignment="Bottom"/> 
                    <Label x:Name="lbl_3" Content="3" Margin="0,8.083,-15,-11.751" FontSize="11.333" HorizontalAlignment="Right" Width="33.35" Foreground="Black"/> 
                </Grid> 
            </ControlTemplate>
    
            <ControlTemplate
                x:Key="oneNumberTemplate"
                TargetType="{x:Type Button}">
                    <Label x:Name="lbl_3" Content="3" FontSize="11.333"/> 
            </ControlTemplate>
        </Grid.Resources>
    
        <Button x:Name="btn_num" Width="51"  Margin="318.849,158,262.15,0" Height="45" VerticalAlignment="Top" Template="{StaticResource threeNumberTemplate}"></Button>  
        <Button x:Name="btn_a" Content="A" HorizontalAlignment="Left" Margin="225.333,158,0,0" Width="55" Foreground="Black" Height="45" VerticalAlignment="Top" Click="btn_alt_Click" />  
    </Grid>  
    

    代码隐藏 -

    private void btn_alt_Click(object sender, RoutedEventArgs e)
    {
        if (_AClick == 0)
        {
            _AClick = 1;
            btn_num.Template = FindResource("oneNumberTemplate") as ControlTemplate;
        }
        else
        {
            btn_num.Template = FindResource("threeNumberTemplate") as ControlTemplate;
            _AClick = 0;
        }
    }  
    

    通过将_AClick 设为DependecyProperty 并使用它的值在触发器中交换模板,可以通过触发器实现相同的目的。

    另一种方法是拥有两个Buttons,并根据代码中的_AClick 值隐藏/显示它们。

    【讨论】:

    • 在不改变xaml代码的情况下有没有可能。上面的代码是一个按钮就可以了。但是我会开发这个程序有很多方法,它不会好的。
    • 很多事情都是可能的,比如改变单个标签的可见性等。如果没有您的确切要求的完整细节,就不可能提出任何建议!
    【解决方案2】:

    您可以创建三个DataTemplate 并使用DataTemplateSelector 类在运行时加载相应的数据模板。

    MSDN - DataTemplateSelector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2017-03-17
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 2019-01-31
      相关资源
      最近更新 更多