web-dev-qa-db-ja.com

C#WPFは、実行時にメインウィンドウに制御を追加します

私の目標は、アプリケーションの実行中に新しいイメージコントロールをアタッチすることです。

img = new System.Windows.Controls.Image();
img.Margin = new Thickness(200, 10, 0, 0);
img.Width = 32;
img.Height = 32;
img.Source = etc;

私はもう試した

this.AddChild(img);// says must be a single element
this.AddLogicalChild(img);// does nothing
this.AddVisualChild(img);// does nothing

フォームで要素を追加することは、これほど難しいことではありませんでした。この新しい要素を(別のコントロールではなく)メインウィンドウに単純にアタッチして、表示されるようにするにはどうすればよいですか。

それを解決し、グリッドにmainという名前を付けました。そこから、children属性とadd関数にアクセスできました。

main.children.add(img);

<Window x:Class="Crysis_Menu.MainWindow"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded" AllowsTransparency="False" Background="White" Foreground="{x:Null}" WindowStyle="SingleBorderWindow">
    <Grid Name="main">
        <Button Content="Run" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="btnRun" VerticalAlignment="Top" Width="151" Click="btnRun_Click" />
        <TextBox Height="259" HorizontalAlignment="Left" Margin="12,40,0,0" Name="tbStatus" VerticalAlignment="Top" Width="151" />
    </Grid>
</Window>
12
Drake

ウィンドウの下にはルート要素が1つだけあるはずです。 this.AddChildaを使用して画像を追加すると、画像がウィンドウの子として追加されますが、おそらく他の子が定義されています(グリッドなど)。この子(例ではグリッド)に名前を付けてから、背後のコードで画像をグリッドに追加します

例:

<Window>
<Grid x:Name="RootGrid">

</Grid>
</Window>

次に、使用の背後にあるコードで

RootGrid.Children.Add(img);
13
Kiril Popov

あなたの場合のthisは何ですか? _this.Content = image;_またはthis.Children.Add(image);を試すことができます

thisが実際にWindowである場合、WindowContentに入れる子を1つだけ持つことができることを知っておく必要があります。 Windowに複数のアイテムが必要な場合は、通常、適切なコンテナ(たとえば、GridまたはStackPanel)をWindowのコンテンツとして配置し、それに子を追加します。

4
Vlad

Vladは解決策を得ました。私はそれを使用しました:

var grid = this.Content as Grid;

// or any controls
Label lblMessage = new Label
{
    Content = "I am a label",
    Margin = new Thickness(86, 269, 0, 0)
};

grid.Children.Add(lblMessage);