3

要素の Loaded イベントにハンドラーをアタッチすると (それが VS デザイナーにあるかコードにあるかに関係なく)、IsLoaded プロパティが true に設定されます。

たとえば、2 つの TabItems を持つ TabControl があります。各 TabItem にボタンがあります。最初の TabItem は既定の項目です (私のウィンドウが表示されたときに選択されます)。2 番目の TabItem の Button には、Loaded イベントがアタッチされています。この場合、最初の TabItem のボタンは IsLoaded が true に設定されており、2 番目の TabItem のボタンは false に設定する必要がありますが、true に設定されています。

Loaded イベントの設定を解除すると、期待どおりに動作します。最初のボタンは IsLoaded が true で、2 番目のボタンは false です。

これはwpfのバグですか、それとも何か間違っていますか?

編集:

例を参照してください。

このコードにより、btn2 の IsLoaded プロパティが True に設定されます (注: btn2_Loaded メソッドは空です)。

XAML:

    <Window x:Class="WpfApplication1.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">
    <Grid>
        <TabControl>
            <TabItem Header="Tab1">
                <Button x:Name="btn1" Click="btn1_Click" />
            </TabItem>

            <TabItem Header="Tab2">
                <Button x:Name="btn2" Loaded="btn2_Loaded" />
            </TabItem>
        </TabControl>
    </Grid>
</Window>

C#:

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(this.btn2.IsLoaded.ToString());
    }

アプリケーションを起動し、btn1 をクリックします。

Loaded ハンドラーを削除します。

            <TabItem Header="Tab2">
                <Button x:Name="btn2" />
            </TabItem>

アプリケーションを再度起動し、btn1 をクリックします。

IsLoaded が False になりました。なぜこうなった?イベント ハンドラーをアタッチすると、特定の要素が読み込まれますか?

4

1 に答える 1

3

これは WPF のバグでもなければ、間違ったことをしているわけでもありません。オブジェクトのライフタイム イベントに関する MSDN ページには、次のように書かれています。

Loaded イベントは、最終的なレンダリングの前に発生しますが、レイアウト システムがレンダリングに必要なすべての値を計算した後で発生します。

正確に Loaded がいつ呼び出されるかについて、これ以上正確な仮定を行うことはできません。あなたの場合、Loaded ハンドラーがアタッチされていない限り、 WPF は非表示 (つまり、まだレンダリングされていない) 要素の読み込みを遅らせると思います。そうするのは自由です。

于 2012-05-23T06:02:26.150 に答える