首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ContentPresenter极度困惑

对ContentPresenter极度困惑
EN

Stack Overflow用户
提问于 2010-09-06 15:14:18
回答 1查看 2.4K关注 0票数 4

我对银光很陌生。

好的,所以我想构建一个简单的用户控件,它包含一个按钮加上控件的客户端指定的一些额外的XAML。

我在谷歌上搜索,发现至少有30篇不同的文章非常令人困惑,尤其是因为他们谈论的是动画的样式化、定制其他你不拥有的控件以及其他我还没有准备好的垃圾。

我就是这么做的。

  • 在VS 2010中,我右击并添加了一个名为UserControl的新MyControl。
  • 在MyControl.xaml中,我将LayoutRoot更改为StackPanel,并在其中添加了一个按钮
  • 在我的MainPage.xaml中,我添加了一个MyControl实例
  • 我添加了一个TextBox作为这个实例的子元素
  • 我尝试构建并得到了一个错误,MyControl不支持直接内容

谷歌更多..。

  • 我将MyControl更改为从ContentControl继承,并更新了xaml
  • 我在xaml中添加了一个ContentPresenter来表示客户端的“自定义内容”。

好的,它构建并显示TextBox,但是按钮不见了。

这是MainPage.xaml的相关部分

代码语言:javascript
复制
<my:MyControl HorizontalAlignment="Left" Margin="49,26,0,0" x:Name="myContentControl1" VerticalAlignment="Top" Height="550" Width="389">
     <TextBox Height="72" HorizontalAlignment="Left" Margin="166,339,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="460" />
</my:MyControl>

这是MyControl.xaml

代码语言:javascript
复制
<ContentControl x:Class="ContentControlTest.MyControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="480" d:DesignWidth="480">

    <StackPanel x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Orientation="Vertical">
        <ContentPresenter/>
        <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="78,254,0,0" Name="FooFoo" VerticalAlignment="Bottom" Width="160" />
    </StackPanel>
</ContentControl>

这是MyControl.cs

代码语言:javascript
复制
using System.Windows.Controls;

namespace ContentControlTest
{
    public partial class MyControl : ContentControl
    {
        public MyControl()
        {
            InitializeComponent();
        }
    }
}

我认为它的工作方式是将控件实例的子元素设置为MyControl的MyControl基类上的Content属性。然后,ContentPresenter将内容“粘贴”到MyControl.xaml中的任何位置。

虽然这似乎确实是它的工作方式,但在这个过程中,它正在“吃”我在MyControl.xaml中定义的按钮。

我试图不进入ControlTemplate等,在这一点上,除非它是绝对必要的。

有线索的人能告诉我我做错了什么吗?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-06 15:56:36

这是因为控件的内容是手工编写的整个StackPanel;当设置新内容时,StackPanel将被替换。

我认为,对于这种情况,ControlTemplate是必要的;毕竟,它是非常简单的。起点可以是内容控件的默认样式;将样式放在ResourceDictionary中(例如,在用户控件的<ContentControl.Resources>部分),就可以开始了;您所需要做的就是在该模板中添加一个网格和按钮。

请注意,我链接到的样式将自身设置为任何可访问ContentControl的默认设置;要使其仅应用于您的控件,而不应用于它中可能出现的任何子控件,请将x:Key="someKey"添加到样式中,并显式地将ContentControl的style属性设置为Style={StaticResource someKey}

如果您需要更多信息,请告诉我;此外,我可能错了,而且可能有更简单的方法,但我对此表示怀疑;Content属性的行为与您所描述的完全相同。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3652517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档