Дайте имя и объявите обработчик события кнопки, созданной во время выполнения с C # XamlReader - PullRequest
0 голосов
/ 06 декабря 2011

Я работаю над проектом на 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 во время выполнения, и я просто делаю это неправильно?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Вы МОЖЕТЕ установить свойство Name для кнопки.

//... 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 += ...
1 голос
/ 06 декабря 2011

Вы можете определить Grid во время выполнения, как вы можете сделать это с большинством других элементов управления.Вот страница, показывающая пример того, как:

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

, чем вы сможете использовать объекты кнопок и обращаться к ним с помощью c #, как:

Button myBtn =новая кнопка ();Button.Click + = new ....

...