2017-10-12 2 views
1

Im tray_ing abrufen, um ein UIElement von einem UserControl im Code hinter FindControl-Methode, aber ich bekomme ein Null-Objekt.Kann nicht ein UIElement von einem UserControl mit FindControl

Ich findControl-Methode auf diese Weise aufrufen: Canvas Canvas = FindControl (this, typeof (Canvas), "mPDFView"); ScrollViewer touchLayer = FindControl (dies, typeof (ScrollViewer), "mtouchLayer");

Wo Findcontrol-Methode ist:

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; 
    } 

Meine 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> 

+0

@mjwills Ich aktualisierte den Beitrag mit dem XAML –

+0

Sie sollten es in [Wie zu finden: ControlTemplate-Generated Elements | Microsoft Docs] (https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/how-to-find-controltemplate-generated-elements) – lindexi

Antwort

0

I Findcontrol-Methode auf diese Weise rufe: Canvas Leinwand = Findcontrol (this, typeof (Canvas) , "mPDFView");

Erstens ist die Art und Weise Sie rufen die FindControl falsch ist, sollten Sie es wie folgt aufrufen:

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

Daneben ist das Code-Snippet korrekt. Es ist gut auf meiner Seite gearbeitet.

aber darauf achten, dass in der obigen XAML-Code-Snippet der ContentControl drei DataTemplates hat, mit einem DataTemplateSelector zu bestimmen, welche DataTemplate für die Verwendung ausgewählt wird. Das Canvas Element befindet sich nur in der DataTemplatePdf genannt, nur die Pdf ausgewählt haben, können Sie das Canvas Element erhalten, sonst mit anderen DataTemplate ausgewählt, wird die visuelle Struktur nicht enthalten Canvas Elemente.

Damit der wahrscheinlichste Grund, dass Sie den null Wert zurückgegeben erhalten, ist der aktuell ausgewählte DataTemplate ist nicht Pdf.

Da Sie das DocumentTemplateSelector relative Code-Snippet nicht zur Verfügung gestellt haben, erstelle ich ein einfaches, das immer Pdf DataTemplate zurückgibt, das das Canvas Element gut finden kann.

<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; 
    } 
} 

Wie die ScrollViewer. Wenn Sie weiterhin Probleme haben, geben Sie bitte ein minimal reproduziertes Projekt an.

Verwandte Themen