【问题标题】:C# Equivalent code for xaml phrasesxaml 短语的 C# 等效代码
【发布时间】:2017-12-18 09:38:36
【问题描述】:

我还需要在我的 C# 代码中动态添加一些控制单元,例如 GridCheckboxTextblock 和 ...。

假设 XAML 节点如:

<CheckBox Content="CheckBox" Height="24" Click="CheckBoxes_Click"/>

它的 C# 等价物是

AddNewCheckBox()
{
     CheckBox NewCheckBox = new CheckBox ();
     NewCheckBox.Content = "CheckBox1";
     NewCheckBox.Height = 24;
     NewCheckBox.Click += CheckBoxes_Click;
}

但是有许多 XAML 分配很难理解它们的 C# 等效项。 例如,我应该在我的 c# 中写什么来创建这样的CheckBox

<CheckBox Content="CheckBox" Margin="68,41,0,0" Background="Black"
          Height="Auto" Click="CheckBoxes_Click"/>

有什么方法可以理解 XAML 解析器如何将短语映射到 C# 代码?

【问题讨论】:

  • Background等...
  • 为什么在代码中而不是在模板中使用动态 xaml?更简单,更清洁
  • 不清楚how XAML parser maps phrases to C# code是什么意思
  • Margin 属性是Thickness 类型,它有一个ThicknessConverter 类型的TypeConverter 集,这种类型知道如何“映射短语”。这是您在问题中所指的吗?

标签: c# wpf xaml


【解决方案1】:

例如,我应该在我的 c# 中写什么来创建这样的 CheckBox?

或多或少都一样。 XAML 中的每个属性都映射到 C# 中的一个属性。所以相当于:

CheckBox checkBox = new CheckBox();
checkBox.Content = "CheckBox";
checkBox.Margin = new Thickness(68,41,0,0);
checkBox.Background = Brushes.Black;
checkBox.Click += CheckBoxes_Click;

Background 属性的类型是BrushMargin 属性的类型是Thickness。您可以通过查看 MSDN 上的 documentation 来确认这一点。

XAML 处理器能够为您将字符串“Black”转换为Brush,并将值“68,41,0,0”转换为Thickness。 C# 编译器不是。除此之外,您正在设置完全相同的类的完全相同的属性。

【讨论】:

    【解决方案2】:

    有什么方法可以理解 XAML 解析器如何将短语映射到 C# 代码?

    看这个例子:

    <CheckBox Content="CheckBox"
              Margin="68,41,0,0"
              Background="Black"
              Height="Auto"
              Click="CheckBoxes_Click"/>
    

    如果我们想了解 XAML 解析器如何知道如何设置更复杂的属性(那些不能简单地使用类型的 TryParse() 方法的属性),我们需要查看属性的类型。

    如果您查看 Margin 属性,例如,它的类型是 Thickness,如果您查看该类型,您会发现此属性:

    [TypeConverter(typeof(ThicknessConverter))]
    

    如果您使用例如 dotPeek 查看该类型(在 PresentationFramework.dll 中),您会发现负责转换的 ConvertFrom(...)ConvertTo(...) 方法。内部方法FromString(...) 包含此示例的相关部分。

    【讨论】:

      【解决方案3】:

      我应该在我的 c# 中写什么来创建这样的复选框?

      <CheckBox Content="CheckBox" 
                Margin="68,41,0,0" 
                Background="Black" 
                Height="Auto" 
                Click="CheckBoxes_Click"/>
      

      以上等价于

      var checkBox = new CheckBox () {
          Content = "CheckBox",
          Margin = new Thickness(64, 41, 0, 0),
          Background = Brushes.Black,
          Height = Double.NaN              
      };
      checkBox.Click += CheckBoxes_Click 
      

      【讨论】:

        【解决方案4】:

        要创建这样的复选框,你应该这样写:

        AddNewCheckBox()
        {
             CheckBox NewCheckBox = new CheckBox ();
        
             NewCheckBox.Content = "CheckBox1";
             NewCheckBox.Height = 24;
             NewCheckBox.Click += NewCheckBox_Click;
             NewCheckBox.Margin = new Thickness(64, 41, 0, 0);
             NewCheckBox.Background = new SolidColorBrush(Color.Black);
             //or like this: NewCheckBox.Background = Brushes.Black;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-03-21
          • 2015-03-26
          • 1970-01-01
          • 1970-01-01
          • 2011-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多