C# 如何在窗口内添加UserControl并分配x:Name
首先为我的英语感到抱歉,再一次抱歉,我是初学者,也许我尝试做一些不可能的事情 我的目标是创建一个UserControl,使用不同的参数在不同的窗口/页面/usercontrols中重用代码。我开发了一个类来打印框,以便通过视频跟踪对象 我的问题是,在编译时,我收到了以下错误: 名称“MediaBox”在当前上下文中不存在 如果我改变:C# 如何在窗口内添加UserControl并分配x:Name,c#,wpf,C#,Wpf,首先为我的英语感到抱歉,再一次抱歉,我是初学者,也许我尝试做一些不可能的事情 我的目标是创建一个UserControl,使用不同的参数在不同的窗口/页面/usercontrols中重用代码。我开发了一个类来打印框,以便通过视频跟踪对象 我的问题是,在编译时,我收到了以下错误: 名称“MediaBox”在当前上下文中不存在 如果我改变: <local:MediaBoxes x:Name="mediaBoxes"></local:MediaBoxes> MediaBox是一
<local:MediaBoxes x:Name="mediaBoxes"></local:MediaBoxes>
MediaBox是一个用户控件,具有:
mediaboxs.xaml
<UserControl x:Class="MyModule.MediaBoxes"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:MyModule"
xmlns:media="clr-namespace:Genetec.Sdk.Media;assembly=Genetec.Sdk.Media"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Styles/Colors.xaml"></ResourceDictionary>
<ResourceDictionary Source="../Styles/Fonts.xaml"></ResourceDictionary>
<ResourceDictionary Source="../Styles/Texts.xaml"></ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<DockPanel Name="containerVideo" Grid.Row="0">
<Canvas Name="canvas" Background="{StaticResource GreyDark4Brush}"
Width="{Binding ActualWidth, ElementName=mediaPlayer}"
Height="{Binding ActualHeight, ElementName=mediaPlayer}"
Visibility="Collapsed">
<media:MediaPlayer Name="mediaPlayer"
Width="{Binding ActualWidth, ElementName=containerVideo}"
Height="{Binding ActualHeight, ElementName=containerVideo}" />
<Canvas Name="CanvasBoxes" />
<Canvas Name="CanvasControls">
<TextBlock Name="plyrBoxesCameraTitle" Canvas.Top="24" Canvas.Left="24" Foreground="LightGray" />
<TextBlock Name="plyrBoxesDateTime" Canvas.Top="56" Canvas.Left="24" Foreground="LightGray" />
<Button Name="plyrBoxesBookmarkBtn" Canvas.Top="24" Canvas.Right="24">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
<Grid Canvas.Bottom="0" Canvas.Left="0"
Width="{Binding ActualWidth, ElementName=CanvasControls}">
<Grid.Resources>
<Style TargetType="Border">
<Setter Property="Padding" Value="24" />
</Style>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0" HorizontalAlignment="Left">
<DockPanel>
<Button Name="plyrBoxesVolumeOnBtn">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
<Button Name="plyrBoxesVolumeOffBtn" Visibility="Collapsed">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
</DockPanel>
</Border>
<Border Grid.Column="1" HorizontalAlignment="Center">
<DockPanel>
<Button Name="plyrBoxesPlayBtn" Visibility="Collapsed">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
<Button Name="plyrBoxesPauseBtn">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
<Button Name="plyrBoxesRestartSequenceBtn">
<Button.Content>
<TextBlock FontFamily="{StaticResource MaterialIcons}" Text=""
Foreground="LightGray" />
</Button.Content>
</Button>
</DockPanel>
</Border>
<Border Grid.Column="2" HorizontalAlignment="Right">
<TextBlock Name="plyrBoxesCurrentTime" Foreground="LightGray" />
</Border>
</Grid>
</Canvas>
</Canvas>
<StackPanel Name="loadingVideoPlayer" Visibility="Visible"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<TextBlock Style="{StaticResource LoadingSpinningText}" FontSize="52" Width="52" Height="52" />
<TextBlock FontSize="18" Margin="0 16">Loading Video</TextBlock>
</StackPanel>
</DockPanel>
</Grid>
</Grid>
非常感谢
更新:
好吧,我发现了真正的问题。。我的代码没有任何问题。。。但我在根路径中定义了一个与我的命名空间同名的类。-'
谢谢大家的帮助 您需要按照以下方式命名
<local:MediaBoxes x:Name="mediaBoxes"></local:MediaBoxes>
<local:MediaBoxes Name="mediaBoxes"></local:MediaBoxes>
mediaBoxes.InitVideo(mainTask.SearchSelectedClips[0], _detection, _sdkEngine);
因此,请按照以下方式为您的usercontrol命名
<local:MediaBoxes x:Name="mediaBoxes"></local:MediaBoxes>
有些ui东西可以有名字,有些不能。不过,您不需要命名控件 您的usercontrol是一个frameworkelement,因此它将具有标准事件。 包括初始化和加载。 您可以通过XAML使用eventhandler钩住其中任何一个
<local:MediaBoxes Initialized="MediaBoxes_Initialized"/>
如果键入initialized=则可以接受它提供给您的存根事件处理程序。老实说,不知道为什么这样做不起作用,但您可以为DockPanel命名,并从其子属性中获取控件y您是对的。。它很好用。。但我不喜欢它,因为这段代码将用于其他程序员在他的解决方案中与我的“库”集成。另一种方法是为您的控件制作一个getter,从dockpanel子控件获取它。类似于
public MediaBox MediaBox=>(MediaBox)DockPanel.Children.FirstOrDefault(x=>x是MediaBox)代码>感谢您的澄清,我想我需要用x:name;)来命名。我已经插入了属性x:Name,正如在我的问题中所说的,编译器返回一个错误:名称“MediaBox”在当前上下文中不存在非常感谢Andy,我是一个非常初学者,我不知道我不能通过名称控制我的控件。您提出的解决方案也很好,但无法直接使用名称与我的控件交互?我需要改变什么?谢谢!!您可以在usercontrol上使用x:Name,没有问题。您确定在同一名称范围内没有其他错误或具有相同名称的其他控件吗?如果你清理了你的项目,问题会消失吗?我检查过了,不,它不是另一个同名的usercontrol。当你说namescope是MyModule???项目中没有任何更改。错误是:类型“MyModule”中不存在类型名称“MediaBox”,它在您的exe中查找,但其中没有MediaBox。这意味着它没有被编译。暂时将usercontrol移出页面。你的项目真的成功了吗?
<local:MediaBoxes Name="mediaBoxes"></local:MediaBoxes>
Because 'Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.Semantics.Metadata.ReflectionTypeNode' is implemented in the same assembly, you must set the x:Name attribute rather than the Microsoft.VisualStudio.DesignTools.Xaml.LanguageService.Semantics.Metadata.ReflectionPropertyNode attribute.
<local:MediaBoxes x:Name="mediaBoxes"></local:MediaBoxes>
mediaBoxes.InitVideo(mainTask.SearchSelectedClips[0], _detection, _sdkEngine);
<local:MediaBoxes Initialized="MediaBoxes_Initialized"/>