【问题标题】:Give a name and declare event handler of a button Created at run time with C# XamlReader命名并声明按钮的事件处理程序在运行时使用 C# XamlReader 创建
【发布时间】:2020-10-10 20:18:48
【问题描述】:

我正在使用 C# 和 WPF 开发一个项目,该项目可以动态创建包含一些文本、图像和按钮的网格布局。我创建了许多这样的网格,并将它们添加到堆栈面板中。我使用 XamlReader.Create() 函数创建了这个网格。这是整个代码,我很抱歉Xaml代码太长了

string xaml = "<Grid Height='92' Margin='0,10,0,0' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>"+
            "<Grid.Background>"+
                "<LinearGradientBrush EndPoint='0.5,1' StartPoint='0.5,0'>"+
                    "<GradientStop Color='#FFACD7FF' Offset='0.172'/>"+
                    "<GradientStop Color='#FFACD7FF' Offset='0.508'/>"+
                    "<GradientStop Color='#FF69B5FF' Offset='0.996'/>"+
                    "<GradientStop Color='#FF79BEFB' Offset='0.017'/>"+
                    "<GradientStop Color='#FFACD7FF' Offset='0.877'/>"+
                "</LinearGradientBrush>"+
            "</Grid.Background>"+
            "<Grid.RowDefinitions>"+
                "<RowDefinition Height='0.522*'/>"+
                "<RowDefinition Height='0.478*'/>"+
            "</Grid.RowDefinitions>"+
            "<Grid.ColumnDefinitions>"+
                "<ColumnDefinition Width='133'/>"+
                "<ColumnDefinition Width='73.5'/>"+
                "<ColumnDefinition Width='0.833*'/>"+
                "<ColumnDefinition Width='0.167*'/>"+
                "<ColumnDefinition Width='108.775'/>"+
            "</Grid.ColumnDefinitions>"+
            "<Image Source='stockHome.jpg' Margin='8' Grid.Column='4' Grid.RowSpan='2'/>"+
            "<TextBlock TextWrapping='Wrap' Text='Details: "+
            addHouse.description+
            "' Margin='8' Grid.Column='2' HorizontalAlignment='Center'/>"+
            "<Button Content='View Full Description' Grid.Column='2' HorizontalAlignment='Center' Margin='4,8,0,8' Grid.Row='1' Width='134.667'/>"+
            "<Label Content='$"+
            addHouse.cost+
            "' Margin='8,8,0,0' FontSize='21.333' FontFamily='Segoe UI Semibold' HorizontalAlignment='Left' RenderTransformOrigin='0.53,1.474'/>"+
            "<Label Content='"+
            addHouse.neighborhood+
            "' Margin='8,0,0,8' Grid.Row='1' HorizontalAlignment='Left' Width='117' FontSize='18.667'/>"+
            "<TextBlock Grid.Column='1' Margin='8,15,8,8' Grid.RowSpan='2' TextWrapping='Wrap'><Run Text='"+
            addHouse.type+
            "'/><LineBreak/><Run Text='"+
            addHouse.bedrooms+
            " Bed'/><LineBreak/><Run Text='"+
            addHouse.bathrooms+
            " Bath'/><LineBreak/><Run Text='ID: "+
            addHouse.ID+
            "'/></TextBlock>"+
            "<Image Grid.Column='3' Margin='8,23.667,8,20.251' Grid.RowSpan='2' Source='HeartPop.png'/>"+
            "</Grid>";  


            // Load the panel
        StringReader stringReader = new StringReader(xaml);
        XmlReader xmlReader = XmlReader.Create(stringReader);
        Grid readerLoadGrid = (Grid)XamlReader.Load(xmlReader);

这对我来说效果很好,我认为这将是在运行时生成网格布局的正确方法,但现在我需要命名按钮并定义事件处理程序,这就分崩离析了。当我尝试将按钮描述更改为

 <Button x:Name = 'houseButton' Click = 'descriptionButtonClick' ...

我收到 XAMLParse 异常。在阅读完此内容后,我不太确定您是否可以在运行时在 xaml 中声明这些内容。所以现在,我对如何做到这一点感到非常困惑。创建网格后,我不能只更改名称,因为它没有名称可供调用。有没有办法访问 UIElement 的子元素,即使它没有名字?或者有没有办法在运行时在 XAML 中声明名称而我只是做错了?

【问题讨论】:

    标签: c# wpf xaml xamlparseexception xamlreader


    【解决方案1】:

    您可以像使用大多数其他控件一样在运行时定义 Grid。这是一个显示示例的页面:

    http://sullivan.net/blog/2009/09/creating-a-wpf-grid-programmatically-code-behind/

    您将能够使用按钮对象并使用 c# 访问它们,例如:

    按钮 myBtn = new Button(); Button.Click += new ....

    【讨论】:

    • 我最终这样做了。有时我花了很长时间才找到工作的捷径,以至于忘记了另一种方法是什么。
    【解决方案2】:

    您可以设置按钮的名称属性。

    //... xaml definition
    <Button Name='houseButton' ... />
    //... xaml definition
    

    你可以得到附加事件的按钮:

    var xamlObj = XmlReader.Create(new StringReader(xamlString));
    Grid grid = XamlReader.Load(xamlObj);
    var btn = (Button)grid.FindName("houseButton");
    btn.Click += ...
    

    【讨论】:

    • 我无法让它工作。每当我尝试定义名称时,我都会收到 Xaml 解析错误。不过对 FindName 方法很感兴趣。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 2023-04-05
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多