簡體   English   中英

為什么按鈕的內容模板沒有對象?

[英]why content template of button does not have object?

我只是在探索Windows Phone運行時應用程序模板 但是我看到一個奇怪的事情。

我在Xaml中定義了Button,並在其中設置了ContentTemplate 我想提取此按鈕的ContentTemplate中定義的Image控件。 但這是空的。

XAML代碼 :-

<Button x:Name="PlayButton" Click="PlayButton_OnClick">
        <Button.ContentTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal" Name="Panel">
                    <Image x:Name="ControlImg" 
                     Width="100"
                    />
                    <TextBlock Text="text block" />
                </StackPanel>
            </DataTemplate>
        </Button.ContentTemplate>

這是按鈕單擊事件 :-

private async void PlayButton_OnClick(object sender, RoutedEventArgs e)
{
        var btn = sender as Button;

        var ct = btn.ContentTemplate; // this part is also not showing controls in it when expending ct at runtime.

        var img = btn.FindName("ControlImg") as Image; // coming null 

        var stckpnl = btn.FindName("Panel") as StackPanel;// coming null
}

有人可以檢查出這是為什么嗎?

編輯 :-我已經解決了我的問題,並達到了這個非常簡單的底層,看到這個之后,我只是不明白為什么會這樣?

那是奇怪的行為。 它應該在控制模板中具有堆棧面板和圖像。 作為解決方法,您可以使用ContentTemplateRoot獲取圖像和堆棧面板。 我已經測試過了,它正在工作。

((StackPanel)btn.ContentTemplateRoot).Children[0] // image

希望這可以幫助

編輯:

有關FindName為什么不起作用的詳細信息,請參見MSDN上的“備注”部分。 這是一些相關的報價

重要說明為了有效地使用FindName方法,您應該了解XAML名稱范圍的概念,以及如何在XAML加載時創建XAML名稱范圍,然后在運行時對其進行引用和可能的修改。 有關更多信息,請參見XAML名稱范圍。 Windows運行時代碼中最常見的FindName用法是從XAML頁面的InitializeComponent調用中產生。 在這種情況下,僅在加載XAML頁面之后才調用FindName。 InitializeComponent提供了基礎結構,以便您的代碼隱藏代碼可以方便地訪問XAML加載實例化的任何對象。 然后,您可以將對象引用為變量,該變量與標記聲明的x:Name具有相同的名稱。 像FindName這樣的運行時API正在內存中存在的應用程序的運行時對象樹上工作。 當從模板或運行時加載的XAML創建該對象樹的一部分時,XAML名稱范圍通常在該對象樹中不連續。 結果是在對象樹中可能存在一個給定的FindName范圍找不到的命名對象。 在典型的應用程序場景中,您可能會遇到XAML名稱范圍之間的不連續性,這是通過應用模板來創建對象時,或者是通過調用XamlReader.Load創建對象並隨后將其添加到對象樹中時。

當您使用DataTemplate時,xaml對象樹不是連續的,這就是為什么FindName無法從xaml樹中找到控件的原因。

希望這能解釋...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM