我正在看一些关于如何在WinRT中创建自定义控件的教程,我有一个问题.

假设我想创建一个简单的控件,其中包含一些东西,例如左边有一个图像的Grid,右边是几个TextBlocks.

我的意思是,简单如下:

<Grid Height="100">
    <Grid.ColumnDeFinitions>
        <ColumnDeFinition Width="0.3*"/>
        <ColumnDeFinition Width="0.7*"/>
    </Grid.ColumnDeFinitions>
    <Image Source"/Assets/someRandomImage.png"/>
    <StackPanel Grid.Column="1"
                VerticalAlignment="Center">
        <TextBlock Text="Some text"
                   Margin="10,10,0"
                   FontSize="24"
                   FontWeight="SemiLight"
                   TextTrimming="CharacterEllipsis"/>
        <TextBlock Text="Some random description..."
                   Margin="10,5,0"
                   FontSize="18"
                   FontWeight="Light"
                   Foreground="Gray"
                   textwrapping="Wrap"
                   TextTrimming="CharacterEllipsis"/>
    </StackPanel>
</Grid>

我将创建一个UserControl与这个内容,所以我可以看到它在XAML设计器中,当我在使用它的UI,我将添加所有的属性和DependencyProperties在UserControl代码后面.

然后我看到另一种方法是使用Template控件,所以我必须创建一个继承自Control类的类,然后使用上面的XAML代码作为模板,并将其应用于自定义控件,并添加所有其余的逻辑在那里.

当然,我也必须将X:Name属性添加到控件内的一些UIElements,以便与它们进行交互,但是你可以得到这个想法.

我想知道,使用这两种方法中的任何一种,或者更好地使用一种,尤其是为什么?
此外,我喜欢使用UserControls,因为我可以在Designer窗口中看到它们,而我将无法使用Template来执行此操作,所以我必须运行应用程序并创建一个控件的实例来查看它其实看起来像

感谢您的帮助,我认为我不是唯一有这个疑问的人,所以我希望这个问题也能帮助别人:D

塞尔吉奥

用户控件

>使用Visual Studio或Blend可以轻松创建UserControl,从而为您提供体面的设计视图支持.
您通常会使用它从多个控件中构建应用程序中的视图.
>它最适用于全屏或全窗口视图,或者您有复杂的视图,您希望在较小的,可重复使用的代码块中分解.
>如果您选择采用MVVM模式,则此类视图通常支持相应的视图模型.
> UserControl的一个问题是,您可以在应用程序的多个位置重复使用它 – 在应用程序的不同位置,对它的外观或行为方式进行轻微的调整是很困难的,因为它不使用模板和UI树被加载到构造函数中.
>通常只能在单个应用程序的范围内重复使用.

自定义控件

>一个自定义控件,或者在某些情况下,模板控件最适合用于单一目的的一小部分UI,它可以显示单个特定类型的信息.
>模板控件可以更改其模板以调整特定用例的视觉效果.它允许你有一个按钮,看起来像一个应用程序的默认按钮,一个圆形的另一个,一个完全由另一个图像.它使它更可重用,这是有道理的,如果你制作多个应用程序或想要与世界分享你的真棒控制.
>一个写得很好的自定义控件通常可以在多个应用程序中重复使用,因为它不依赖于特定应用程序的业务逻辑.
>它通常来自现有的平台控件,例如Button,ToggleButton,ContentControl,Slider,TextBox或ListView,以添加或覆盖其逻辑.有些情况下,从头开始,将“几何抽象”控件,ItemsControl,RangeBase,Shape甚至FrameworkElement(最后两个都不是模板化)进行​​子类化.
>模板控件的可视化树被加载,当模板加载时,可能发生的时间可能晚到控件的可见性首次从“折叠”更改为“可见”,允许延迟加载部件以获得性能改进.
>因为控件模板只能加载一次,所以这些是在任何ItemsControl DataTemplate(列表,网格视图等)中使用的理想选择.如果您使用UserControl,您的性能可能会受到影响,因为UserControl XAML一遍又一遍被解析.

自定义面板

自定义面板是UI元素的另一种类型,允许自定义如何布局其子项.

xaml – 何时在UserControl上使用模板控件?的更多相关文章

  1. 当XAML数据验证失败时,如何让视图模型知道

    我有一个表单,用户可以在其中设置数值过程的参数。尽管该属性是双精度的,但它可能表示布尔值或整数。我不能让Min>;Max或Max<;Min.我已经在XAML中实现了验证,如果数据无效,它会向用户发出视觉警告。Min参数的数据模板如下所示。我希望在参数对象中有一个布尔IsValid属性,以便在用户尝试保存时进行测试。如何从XAML绑定到此IsValid属性?

  2. wpf – 使用Microsoft(或其他)功能区与大型项目和MVVM

    我们是否应该有一个RibbonView和一个Ribbonviewmodel,它将包含功能区中的所有可能项目,每个团队都会将其项目添加到这些V/VM,并定义何时显示它们的逻辑?或者我们是否允许每个视图,视图模型或模块在服务中注册功能区项目,然后让服务在活动视图随注册到该类型的所有项目更改时根据需要呈现功能区?或者有没有更好的方法来实现这种集成?您是否对如何管理多个开发人员常见的单个功能区资源有更好的想法或意见?

  3. ScrollViewer中的WebView带有XAML元素头

    在WebView中,我使用WP8.1加载HTML元素.每当内容超出WebView高度时,滚动都没有问题.我的问题是我在WebView的顶部有XAML元素,它们必须与WebView滚动一起滚动.源代码:每当WebView元素“msgContent”滚动时,我都希望stackpanel“xamlelement”与WebView一起滚动.这里的问题是我们可以通过这2个步骤禁用webview滚动1)设置过度隐藏到加载到webview的html内容2)将webview的高度设置为等于其中加载的html内容.但是当我

  4. xaml – Windows通用响应式设计重新定位

    编辑:我使用一个包含2行和2列的Grid工作,使用AdaptiveTrigger将所有内容从行移动到列,反之亦然.可以通过setter更改RelativePanel附加属性值.语法如下:

  5. xaml – 空列表的列表框项模板

    我有一个列表框,其中包含在XAML中定义的项模板,如下所示:现在我想要的是在列表框的中心显示一行文本,以防该列表框的ItemSource为空.XAML是否支持某种无项目模板?

  6. windows-8 – 最小的Windows 8 C XAML应用程序?

    好吧,我可以从C#告诉你,文件夹结构应该与C类似.>必需:属性–>保存装配信息.>必需:参考–>为地铁和航空公司提供必要的框架..净.>可选?:普通–>持有标准XAML样式.我想如果你不需要使用它们,你可以删除它们.>必需:App.xaml–>处理启动和管理W8应用程序.如果您在C项目中可以看到任何这些文件,请告诉我.

  7. xaml – 将StackPanel背景设置为WP7选择的重音(主题)颜色

    我想知道是否可以将StackPanel的背景设置为WindowsPhone7用户选择的重音(主题)颜色.我听说你应该使用样式,因此它可以用于当前xaml页面上的所有StackPanels.但是我有点失落.我当前静态背景颜色的示例:我在这里先向您的帮助表示感谢.PS:万一有人想知道十六进制值“#FF1BA1E2”是默认WP7蓝色重音(主题)的颜色.使用内置的静态资源自动获取主题颜色:

  8. 如何在WPF中将样式应用于Window Control?

    我正在为App.xaml中的Window设置样式,如下所示:我基本上希望每个Window都将其WindowStyle的属性值设置为None;但它没有用.我在这里想念的是什么?回答问题的人对从具有应用样式的基本窗口继承有一个有趣的想法.

  9. UWP(Windows 10)XAML中的WebBrowser控件

    你能告诉我如何在Windows10XAML中提供浏览器控件吗?

  10. winrt-xaml – XAML中的Metro(Windows应用商店应用)日期时间格式

    我有一个DateTime属性.这是绑定到文本框在WPF中,可以使用以下语法格式化DateTime输出在Metro应用程序(winrt…)中,无法使用FormatString属性.有没有其他方法可以在xaml文件中执行格式化?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部