簡體   English   中英

無法使用FindControl從UserControl獲取UIElement

[英]Cannot get a UIElement from a UserControl using FindControl

我在tray_ing上使用FindControl方法在代碼后面從UserControl獲取UIElement,但是我正在獲取空對象。

我這樣調用FindControl方法:Canvas canvas = FindControl(this,typeof(Canvas),“ mPDFView”); ScrollViewer touchLayer = FindControl(this,typeof(ScrollViewer),“ mtouchLayer”);

其中FindControl方法是:

public static T FindControl<T>(UIElement parent, Type targetType, string ControlName) where T : FrameworkElement
    {
        if (parent == null) return null;

        if (parent.GetType() == targetType && ((T)parent).Name == ControlName)
        {
            return (T)parent;
        }
        T result = null;
        int count = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < count; i++)
        {
            UIElement child = (UIElement)VisualTreeHelper.GetChild(parent, i);

            if (FindControl<T>(child, targetType, ControlName) != null)
            {
                result = FindControl<T>(child, targetType, ControlName);
                break;
            }
        }
        return result;
    }

我的XAML

 <UserControl
x:Class="SalesApp.Views.DocViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SalesApp.Views"
xmlns:uc="using:SalesApp.Views.UserControls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="using:SalesApp.ViewModels"
x:Name="root"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ContentControl x:Name="contentControl" Content="{Binding Item}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
        <ContentControl.Resources>
            <DataTemplate x:Key="Media">
                <Grid Background="Black">
                    <MediaElement Source="{Binding MediaSource}" Volume="10" AreTransportControlsEnabled="True" />
                    <StackPanel HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" Visibility="{Binding ShowActionBar, Converter={StaticResource BoolToVisibilityConverter}}" Margin="0,12,12,0">
                        <Button Command="{Binding EmailCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Visibility="{Binding IsEmailVisible, Converter={StaticResource BoolToVisibilityConverter}}">
                            <BitmapIcon  UriSource="/Assets/icons/icMail.png" Width="50" Height="50" Foreground="{ThemeResource IconsPrimary}"/>
                        </Button>
                        <Button Command="{Binding CloseCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Margin="0">
                            <BitmapIcon  UriSource="/Assets/icons/icClose(1).png" Width="50" Height="50" Foreground="{ThemeResource IconsPrimary}"/>
                        </Button>
                    </StackPanel>
                </Grid>
            </DataTemplate>
            <DataTemplate x:Key="Image">
                <Grid Background="Black">
                    <Image Source="{Binding MediaSource}" />
                    <StackPanel HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" Visibility="{Binding ShowActionBar, Converter={StaticResource BoolToVisibilityConverter}}" Margin="0,12,12,0">
                        <Button Command="{Binding HDCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Visibility="{Binding IsLowDefinition, Converter={StaticResource BoolToVisibilityConverter}}">
                            <TextBlock Text="HD" FontSize="35" FontWeight="ExtraBlack" Foreground="White" Margin="0,-4,0,4" />
                        </Button>
                        <Button Command="{Binding EmailCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Visibility="{Binding IsEmailVisible, Converter={StaticResource BoolToVisibilityConverter}}">
                            <BitmapIcon  UriSource="/Assets/icons/icMail.png" Width="50" Height="50" Foreground="{ThemeResource IconsPrimary}"/>
                        </Button>
                        <Button Command="{Binding CloseCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Margin="0">
                            <BitmapIcon  UriSource="/Assets/icons/icClose(1).png" Width="50" Height="50" Foreground="{ThemeResource IconsPrimary}"/>
                        </Button>
                    </StackPanel>
                </Grid>
            </DataTemplate>
            <DataTemplate x:Key="Pdf">
                <Grid>
                    <Grid.Resources>
                        <CollectionViewSource x:Name="viewSource" Source="{Binding Pages}" />
                    </Grid.Resources>

                        <Canvas  x:Name="mPDFView"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Tapped="FlipView_Tapped" ScrollViewer.HorizontalScrollMode="Disabled" />
                    <ScrollViewer x:Name="mtouchLayer" Background="Transparent" IsHitTestVisible="True" Tapped="FlipView_Tapped" ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.VerticalScrollMode="Disabled"/>
                    <ListView x:Name="pdfThumbnailList" SelectedIndex="{Binding selectedItem}" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollMode="Enabled" ScrollViewer.VerticalScrollMode="Disabled" ItemsSource="{Binding Source={StaticResource viewSource}}" Height="150" Background="DarkGray" VerticalAlignment="Bottom" Visibility="Collapsed" Tapped="ThumbnailItemTapped" SelectionChanged="ThumbnailList_SelectionChanged">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="Margin" Value="0" />
                                <Setter Property="Padding" Value="0" />
                                <Setter Property="VerticalContentAlignment" Value="Stretch" />
                                <Setter Property="VerticalAlignment" Value="Stretch" />
                                <Setter Property="Height" Value="150" />
                            </Style>
                        </ListView.ItemContainerStyle>
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <Image Stretch="Uniform">
                                    <Image.Source>
                                        <BitmapImage UriSource="{Binding ImageSource}" />
                                    </Image.Source>
                                </Image>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                        <ListView.ItemsPanel>
                            <ItemsPanelTemplate>
                                <VirtualizingStackPanel Orientation="Horizontal" VerticalAlignment="Stretch" />
                            </ItemsPanelTemplate>
                        </ListView.ItemsPanel>
                    </ListView>
                    <StackPanel x:Name="pdfActionBar" HorizontalAlignment="Right" VerticalAlignment="Top" Orientation="Horizontal" Visibility="Collapsed" Margin="0,12,12,0">
                        <uc:DocMenuBarUserControl DataContext="{Binding DocMenuVM}" />
                        <Button Command="{Binding CloseCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Visibility="{Binding ShowCloseAction, ElementName=root, Converter={StaticResource BoolToVisibilityConverter}}">
                            <BitmapIcon  UriSource="/Assets/icons/icClose(1).png" Width="50" Height="50" Foreground="{ThemeResource SalesappsPrimary}"/>
                        </Button>
                        <Button Command="{Binding OpenCommand}" Style="{StaticResource NoBorderButtonStyle}" BorderThickness="0" Visibility="{Binding ShowCloseAction, ElementName=root, Converter={StaticResource InverseBoolToVisibilityConverter}}">
                            <BitmapIcon  UriSource="/Assets/icons/icFullscreen.png" Width="50" Height="50" Foreground="{ThemeResource SalesappsPrimary}"/>
                        </Button>
                    </StackPanel>
                </Grid>

            </DataTemplate>

        </ContentControl.Resources>
        <ContentControl.ContentTemplateSelector>
            <local:DocumentTemplateSelector />
        </ContentControl.ContentTemplateSelector>
    </ContentControl>

    <Border  x:Name="trainingPopup" Background="White" BorderBrush="Gray" BorderThickness="1" Visibility="Collapsed" Height="400" Width="700" CornerRadius="5" >
        <Grid Margin="19">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <TextBlock Text="{Binding DataContext.Translations.training_popup_title, ElementName=contentControl}" FontSize="24" />
            <WebView x:Name="trainingWebContent" Grid.Row="1" ScrollViewer.VerticalScrollMode="Auto" ScrollViewer.HorizontalScrollMode="Disabled">
            </WebView>
            <Button Content="{Binding DataContext.Translations.general_close,ElementName=contentControl}" HorizontalAlignment="Right" Click="closeTrainingClick" Grid.Row="2" RequestedTheme="Light" Margin="0,19,0,0" BorderBrush="Black" BorderThickness="1" />
        </Grid>
    </Border>
</Grid>

我這樣調用FindControl方法:Canvas canvas = FindControl(this,typeof(Canvas),“ mPDFView”);

首先,您調用FindControl的方式是錯誤的,應按以下方式調用它:

Canvas canvas = FindControl<Canvas>(this, typeof(Canvas), "mPDFView");

除此之外,代碼段是正確的。 在我這方面效果很好。

但是請注意,在上述XAML代碼段中, ContentControl具有三個DataTemplates ,其中一個DataTemplateSelector用來確定選擇使用哪個DataTemplate Canvas元素僅設在DataTemplate命名為Pdf ,只有Pdf選擇,你可以得到Canvas元素,否則與其他DataTemplate選擇,視覺樹不會包含Canvas元素。

因此,最有可能導致您返回null值的原因是當前選擇的DataTemplate不是Pdf

由於您沒有提供DocumentTemplateSelector相關代碼片段,因此我創建了一個簡單的Pdf DataTemplate ,該Pdf DataTemplate始終返回可以很好地找到Canvas元素的Pdf DataTemplate

<ContentControl.ContentTemplateSelector>
    <local:DocumentTemplateSelector FirstTemplate="{StaticResource  Pdf}" SecondTemplate="{StaticResource Image}"/>
</ContentControl.ContentTemplateSelector>

public class DocumentTemplateSelector : DataTemplateSelector
{
    public DataTemplate FirstTemplate { get; set; }
    public DataTemplate SecondTemplate { get; set; }   

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    { 
        return FirstTemplate; 
    }
}

ScrollViewer相同。 如果仍有問題,請提供一個最小的復制項目。

暫無
暫無

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

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