1

私はC++開発者であり、先週からC#とWPFの作業を開始しました。コードで構造を使用することについて、非常に簡単なクエリがあります。xamlクラスに、動的に生成する必要のあるラベルとボタンがあります。私は次のようにC++で開発しました:

typedef struct 
{
     String ChannelName;
     bool available;
} Voltage_Channel;

Voltage_Channel *m_voltageChannels;

Voltage_Channel redhookChannels[6] = {
  {"", false},
  {"VDD_IO_AUD", true},
  {"VDD_CODEC_AUD", true},
  {"VDD_DAL_AUD", true},
  {"VDD_DPD_AUD", true},
  {"VDD_PLL_AUD", true},    
};

m_voltageChannels = redhookChannels;

int cnt = 0; 
int MAX_ADC =6;

while(cnt < MAX_ADC)
{
    m_labelChannel[cnt] = new Label(m_voltageChannels[cnt].ChannelName); //Generates labels based on count
    m_setButton[cnt] = new TextButton("Set"); //generates Buttons based on Count
    m_setButton[cnt]->addButtonListener(this); // Event for the Button

    if(m_voltageChannels[cnt].available)
    {
        addAndMakeVisible(m_labelChannel[cnt]); //Displays if channel is available
        addAndMakeVisible(m_setButton[cnt]);
    }
}  

これにより、ラベルとボタンが6回生成され、チャネルが使用可能な場合はそれが表示されます。

Xamlファイルに次のものがあります。

<Label Grid.Column="0" Content="{Binding VoltageLabel}" Name="VoltageLabel" />
<Button Grid.Column="1" Content="Set" Command="{Binding Path=SetButtonCommand}" Name="VoltageSetbtn" />

ラベルとボタンのプロパティ:

string voltageLabel;
public string VoltageLabel
{
        get { return voltageLabel; }
        set
        {
            voltageLabel = value;
            OnPropertyChanged("VoltageLabel");
        }
}

    // Event for Set Button Click
    private ICommand mSetCommand;
    public ICommand SetButtonCommand
    {
        get
        {
            if (mSetCommand == null)
                mSetCommand = new DelegateCommand(new Action(SetCommandExecuted), new Func<bool>(SetCommandCanExecute));

            return mSetCommand;
        }
        set
        {
            mSetCommand = value;
        }
    }

    public bool SetCommandCanExecute()
    {
        return true;
    }

    public void SetCommandExecuted()
    {
        // Body of the method
    }

C +アプリケーションでどのように実行したかを見て、構造を使用してこれらのコントロールを動的に生成することは可能ですか?

助けてください

4

3 に答える 3

1

宣言型XAML-wayを介して使用できるすべてのコントロールは、実行時にコードで追加することもできます。したがって、while / for/foreachループでビューに追加できます。必要なのは親コンテナだけです。

より洗練された方法は、xaml内にテンプレートを作成し、そのテンプレートをデータを含むリストにバインドすることです。

自動生成されたUIのヒント:データにM $の組み込みのPropertyGridコントロールを使用するオプションである可能性があります(Visual Studioの[プロパティ]ウィンドウに表示されます)。データ要素に標準/カスタムエディタを添付できます。いくつかの「自作」プロパティグリッドも利用できます。

テンプレートの使用方法の簡単な例へのリンクは次のとおりです。http ://wblum.org/listbind/net3/index.html

この質問は、ランタイムコントロールの生成にも関連しています。実行時 にWPFコントロールを追加する

于 2012-10-11T11:29:15.927 に答える
1

C#では、コントロールは単純なオブジェクトです。最終的に、XAMLに存在するすべての機能をコーディングできます。XAMLは、UIオブジェクトとそれらの間の関係を記述するためのより便利な方法です。

各コンポーネントには、サブ要素を追加するために使用できる子プロパティがあります。フォームにボタンを追加すると、次のように機能します。

Button myButton= new Button();
form.Children.Add(myButton);
于 2012-10-11T11:33:07.563 に答える
1

WPFでは、オブジェクトに対して表示されるコントロールを直接マップすることが可能です。たとえば、現在、次のようになっています。

<DataTemplate DataType="{x:Type ViewModel:Clock_t}">
     <View:Clock_tView/>
</DataTemplate>

これにより、UIのClock_tクラスがClockT_Viewで自動的にラップされます。

ただし、ビューにヘルパーが必要であり、モデルを汚染したくない場合は、途中に何かを導入するというパターンがあります。必要に応じて、ViewModelを使用します。このパターンはMVVMと呼ばれ、JoshSmithのMVVMパターンの記事で説明されています

あなたの質問に答えるために、はい、あなたはこのようなことをすることができます

<ItemsControl ItemsSource="{Binding m_voltageChannels}"/>

これにより、が自動的に表示されVoltageChannelますが、DataTemplateがない限り、その結果ToString()(通常はクラス名)を6回取得するだけです。代わりに、リソースのどこかでDataTemplateを上位に定義するか、単に試してみてください

<ItemsControl ItemsSource="{Binding m_voltageChannels}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding ChannelName}"/>
                    <CheckBox Content="Is available?" 
                         IsChecked="{Binding available}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
于 2012-10-11T13:08:15.900 に答える