0

テキスト、画像、ボタンを含むグリッドレイアウトを動的に作成する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で名前を宣言し、それを間違って実行する方法はありますか?

4

2 に答える 2

1

他のほとんどのコントロールと同じように、実行時にグリッドを定義できます。方法の例を示すページは次のとおりです。

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

ボタンオブジェクトを使用して、次のようなc#を使用してそれらにアクセスできるようになるよりも。

ボタンmyBtn=new Button(); Button.Click + =new...。

于 2011-12-06T10:04:10.300 に答える
1

ボタンの 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 += ...
于 2011-12-06T10:59:18.970 に答える