C# UWP用户控制&x2B;内容控制

C# UWP用户控制&x2B;内容控制,c#,xaml,uwp,uwp-xaml,C#,Xaml,Uwp,Uwp Xaml,我试图了解内容控件是如何工作的,以及如何在我正在构建的用户控件中放置一个内容控件。据我所知,我的用户控件应该有一个对象依赖属性,然后我应该能够向我的用户控件添加一个内容控件,并将其绑定到依赖属性 我尝试了用户控件XAML的各种变体,包括绕过ScrollViewer元素,并将ContentControl放置在用户控件XAML的基本网格内 如何将此图像放置在此控件中?更广泛地说,如何将任何XAML放在用户控件中 用户控制CS namespace CoreProject.UserControls {

我试图了解内容控件是如何工作的,以及如何在我正在构建的用户控件中放置一个内容控件。据我所知,我的用户控件应该有一个对象依赖属性,然后我应该能够向我的用户控件添加一个内容控件,并将其绑定到依赖属性

我尝试了用户控件
XAML
的各种变体,包括绕过
ScrollViewer
元素,并将
ContentControl
放置在用户控件
XAML
的基本网格内

如何将此图像放置在此控件中?更广泛地说,如何将任何
XAML
放在用户控件中

用户控制CS

namespace CoreProject.UserControls
{
public sealed partial class ZoomControl : UserControl
{
    public ZoomControl()
    {
        this.InitializeComponent();
    }

    #region Properties
    public static readonly DependencyProperty ZoomContentProperty =
    DependencyProperty.Register("ZoomContent", typeof(object), typeof(ZoomControl), new PropertyMetadata(null));
    public object ZoomContent
    {
        get { return (object)GetValue(ZoomContentProperty); }
        set { SetValue(ZoomContentProperty, value); }
    }
    #endregion

    public void UnZoom()
    {
        // unzoom
        ImageScrollViewer.Visibility = Visibility.Visible;
        var period = TimeSpan.FromMilliseconds(10);
        Windows.System.Threading.ThreadPoolTimer.CreateTimer(async (source) =>
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                ImageScrollViewer.ChangeView(0.0, 0.0, 0.8F, true);
                ImageScrollViewer.Visibility = Visibility.Collapsed;
            });
        }, period);
    }

    public void ZoomToPosition(double zoomOriginX, double zoomOriginY, float zoomFactor, bool disableAnimations)
    {
        ImageScrollViewer.Visibility = Visibility.Visible;
        var period = TimeSpan.FromMilliseconds(10);
        Windows.System.Threading.ThreadPoolTimer.CreateTimer(async (source) =>
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                ImageScrollViewer.ChangeView(zoomOriginX, zoomOriginY, 1.2F, disableAnimations);
            });
        }, period);
    }
}
}

用户控件Xaml

<Grid>
    <ScrollViewer x:Name="ImageScrollViewer" 
                  ZoomMode="Enabled" 
                  Visibility="Collapsed" 
                  HorizontalContentAlignment="Center" 
                  VerticalContentAlignment="Center" 
                  Background="Transparent" 
                  HorizontalScrollMode="Enabled"
                  VerticalScrollMode="Enabled"
                  HorizontalScrollBarVisibility="Hidden"
                  VerticalScrollBarVisibility="Hidden">
        <Grid>
            <!-- HERE IS WHERE I WANT TO PLACE MY CONTENT -->
            <ContentControl Content="{Binding ZoomContent, ElementName=zoomContent}" />
        </Grid>
    </ScrollViewer>
</Grid>

用户控制使用情况

<usercontrols:ZoomControl x:Name="ZoomControl">
    <usercontrols:ZoomControl.ZoomContent>
        <!-- THIS IS HOW I WANT TO ADD MY CONTENT, SIMPLY PLACE XAML ELEMENT -->
        <Image Source="/Assets/colocationDataCenterData.jpg" />
    </usercontrols:ZoomControl.ZoomContent>
</usercontrols:ZoomControl>

此绑定的意思是“找到名为zoomContent的UI元素,并绑定到该对象的
zoomContent
属性”。它不起作用,因为范围中没有像
zoomContent
这样的元素

<ContentControl Content="{Binding ZoomContent, ElementName=zoomContent}" />
并遵守以下规定:

<ContentControl Content="{Binding ZoomContent, ElementName=userControl}" />

更新
然而,@JohnnyWestlake比我更了解UWP。使用他的解决方案,在这种情况下更为正确

此绑定的意思是“找到名为zoomContent的UI元素,并绑定到该对象的
zoomContent
属性”。它不起作用,因为范围中没有像
zoomContent
这样的元素

<ContentControl Content="{Binding ZoomContent, ElementName=zoomContent}" />
 <Grid>
     <!-- HERE IS WHERE I WANT TO PLACE MY CONTENT -->
     <ContentControl Content="{x:Bind ZoomContent, Mode=OneWay}" />
 </Grid>
并遵守以下规定:

<ContentControl Content="{Binding ZoomContent, ElementName=userControl}" />

更新 然而,@JohnnyWestlake比我更了解UWP。使用他的解决方案,在这种情况下更为正确


 <Grid>
     <!-- HERE IS WHERE I WANT TO PLACE MY CONTENT -->
     <ContentControl Content="{x:Bind ZoomContent, Mode=OneWay}" />
 </Grid>
您也可以使用x:Bind,它将绑定上下文作为类本身(您的UserControl),因此您可以直接绑定

如果希望经典绑定工作,则需要在userControl本身内部命名和userControl。(顺便说一句,通常作为模板控件执行此操作,并使用templatebindings)



您也可以使用x:Bind,它将绑定上下文作为类本身(您的UserControl),因此您可以直接绑定

如果希望经典绑定工作,则需要在userControl本身内部命名和userControl。(顺便说一句,通常作为模板控件执行此操作,并使用templatebindings)



ElementName=zoomContent
——在该范围内没有名为
zoomContent
的元素,因此没有绑定的源。尝试命名UserControl
x:Name=“UserControl”
并绑定到
ElementName=UserControl
。这意味着“在这个范围内找到一个名为
userControl
的XAML元素,并绑定到该元素的
zoomcontent
属性”?然后更新
ElementName
以引用它?否。如果某个父控件将某个特定实例命名为其他实例,该怎么办?那会打破控制。如果在同一个父级中有两个实例,该怎么办?他们必须有不同的名字,所以只有一个可以工作。它也超出了用户控件内XAML的范围。不,UserControl XAML的根标记为
UserControl
inside
MyUserControl.XAML
。给它起个名字。在将使用名称的作用域中。为其命名并在绑定中使用
ElementName
的名称
ElementName=zoomContent
--该作用域中没有名为
zoomContent
的元素,因此绑定没有源。尝试命名UserControl
x:Name=“UserControl”
并绑定到
ElementName=UserControl
。这意味着“在这个范围内找到一个名为
userControl
的XAML元素,并绑定到该元素的
zoomcontent
属性”?然后更新
ElementName
以引用它?否。如果某个父控件将某个特定实例命名为其他实例,该怎么办?那会打破控制。如果在同一个父级中有两个实例,该怎么办?他们必须有不同的名字,所以只有一个可以工作。它也超出了用户控件内XAML的范围。不,UserControl XAML的根标记为
UserControl
inside
MyUserControl.XAML
。给它起个名字。在将使用名称的范围内。为其命名并在绑定中使用
ElementName
的名称