- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 c# 和 silverlight-5 初学者。
首先,我必须通过反序列化 xml 字符串来创建对象。我已经成功地做到了这一点,但现在我的下一步是使用对象元素创建 GUI。我知道我必须使用“IValueConverter
”来执行此操作。但我不知道这是怎么回事。
我的包含对象的程序类是这样的:
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Json;
using System.Runtime;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.IO;
using System.Collections.Generic;
using System.Diagnostics;
using System.Xml;
using System.Collections;
namespace Model.XML
{
public class ProgramControl
{
public static void Main()
{
string xmlstring = @"<?xml version='1.0' encoding='utf-8' ?>
<parameter>
<name>max_amount</name>
<label>Max Amount</label>
<unit>Millions</unit>
<component>
<type>Combo</type>
<attributes>
<type>Integer</type>
<displayed>4</displayed>
<selected>0</selected>
<items>
<item>5</item>
<item>10</item>
<item>20</item>
<item>50</item>
</items>
</attributes>
</component >
</parameter>";
XmlSerializer deserializer = new XmlSerializer(typeof(Parameter));
XmlReader reader = XmlReader.Create(new StringReader(xmlstring));
Parameter parameter = (Parameter)deserializer.Deserialize(reader);
foreach (var item in parameter.Component.Attributes.Items)
{
Debug.WriteLine(item);
}
Debug.WriteLine(parameter.Component.Type);
Debug.WriteLine(parameter.Name);
Debug.WriteLine(parameter.Label);
Debug.WriteLine(parameter.Unit);
}
}
}
现在的问题是如何从反序列化 (IValueConverter) 获得的对象创建 GUI?
编辑:我不知道如何实现它:
首先是在包含“IValueConverter”接口(interface)的类中,我们必须将对象(在反序列化时获得)转换(使用 Convert() 函数)到参数中,然后将这些参数(包含在 c# 中创建的组合框)传递给返回
到包含容器的 xaml 代码,以呈现我们刚刚使用 c# 创建的 GUI。
在 Xaml 代码中,我们只需要创建一个容器来显示我们在上一步中用 C# 代码创建的组合框和其他标签和文本。 (我们不必在这里使用 xaml 创建组合框,它是在包含返回 UI 的 IValueConverter 接口(interface)的类内的 c# 代码中创建的)。
例如:(粗略的让大家理解正确,可能会有一些语法错误):
假设我的“MyValueConverter.cs”类:
public class MyValueConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
List<parameter> list = value as List<Parameter>;
List<UIElement> result = new List<UIElement>();
foreach(parameter p in list)
{
UIElement newEle = null;
if (p.component.type == "Combo")
{
newEle = new ComboBox();
}
result.add(newEle);
}
return result;
/////////////////////////////////////////////////
//////////////// and so on ://///////////////////
/////////////////////////////////////////////////
}
}
而在 xaml 文件中,我必须创建一个容器来呈现在 c#(IValueConverter 接口(interface)类)中创建的 UI。 所以我们必须选择任何容器,它必须能够渲染组合框、标签、文本以及快照 GUI 中显示的所有数据(容器可以是 StackPanel,因为要显示的东西不止一个).
我的 xaml 代码将只包含一个像这样的容器:
<UserControl x:Class="RenderingTest.MainPage"
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:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:this="clr-namespace:RenderingTest.Converters"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<this:MyValueConverter x:Key="ImageConverter"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White" Width="Auto" Height="Auto">
<!-- There should be container here to render the combo box
created using c# code in "MyValueConverter" class -->
</Grid>
</UserControl>
在实现它方面有什么帮助吗?如果还不明白,请随时询问。
最佳答案
您可以为此使用隐式数据类型。
在您的 xaml 中,您为特定数据类型定义了一个模板:
<DataTemplate DataType="ComboParameter">
<StackPanel Orientation="Horizontal">
<TextBlock Text={Binding Path=label}" />
<ComboBox ItemsSource="{Binding Path=items}"/>
<TextBlock Text="{Binding Path=unit}"/>
</StackPanel>
</DataTemplate>
您最好根据类型元素值创建不同的类型。另一种解决方案是为 Parameter 类型创建一个大模板,并根据 Parameter-type 包含的内容显示适当的元素。但我不推荐这种方法。
然后您可以使用 ItemsControl 来显示所有参数:
<ItemsControl ItemsSource="{Binding Path=Parameters}" />
不同的参数将根据它的类型以不同的方式呈现。
关于c# - 仅使用 C# 代码使用 IValueConverter 呈现 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488983/
我正在尝试将枚举转换为画笔,以便可以使用枚举变量来控制某些控件的颜色 我的枚举(并不真正相关): public enum Colors { Red, Blue, } 这是我的转
我正在使用 .NET 3.5 我有一个 DataGridTextColumn,我想在该列的值为 false 时将背景颜色变为红色。我已经在 XMAL 中看到了这一点,但无法弄清楚如何在代码隐藏中做到这
我有一个 Enum 需要显示在 ComboBox 中。我已经设法使用 ItemsSource 将枚举值获取到组合框,并且我正在尝试将它们本地化。我认为这可以使用值转换器来完成,但由于我的枚举值已经是字
在谷歌上搜索这个问题几个小时,但看不出我哪里出错了。 我有以下转换器,它只返回 Brushes.Red(也尝试过 Colors.Red),但仍然没有成功。 public class ColorConv
我正在尝试创建一个 IValueConverter,它接受一个 enum 并吐出一个 URI。转换器确实按预期在运行时工作。然而,XAML Designer 给我一个错误提示: Object must
我有一个简单的 IValueConverter,它只使用 TypeConverter 进行转换。但是,在某些情况下,提供的 TypeConverter 会失败。 如果转换器未提供 Binding,我想
我有一个具有 3 种通信状态的应用程序:已连接、已断开连接和待处理。通信状态由一些其他参数控制。我想在 IValueConverter 控制的屏幕上显示相应的图像。但我无法让它工作。 这是我包含 3
我有一个 ListView,它有一个包含两列和许多行的 Grid。每行在每一列中都有一个 TextBlock,每个 Text 属性都绑定(bind)到 ListView 的 ItemSource 中的
我有一个包含大约 12 个项目的解决方案,其中一个设置为启动项目,其中包含主窗口。目前我所有的 IValueConverter 都在这个项目中。 我现在想将它们移动到一个单独的项目中,该项目将只包含转
IValueConverter 的最佳实践是什么? : 可以将 Exception 放在 Convert 方法中还是应该返回“something”? 这是一个例子: [ValueConversion(
我正在使用自定义 DateTimeToString :IValueConverter 在我的 ConvertBack 方法中,当转换失败时我抛出异常,但是它没有显示为验证失败(这是一个未处理的应用程序
我有一个异步方法,我想在 IValueConverter 中触发它。 有没有比通过调用 Result 属性强制它同步更好的方法? public async Task Convert(object va
我有一个进度条,我想根据 bool 值更改颜色; true 为绿色,false 为红色。我的代码看起来应该可以工作(当我将它绑定(bind)到文本框时它返回正确的值),但当它是进度条的颜色属性时却不行
我正在尝试使用 IValueConverter 将集合转换为代理对象以进行数据绑定(bind)。 转换器似乎工作正常,但问题是在集合中添加或删除新对象时。 View 中没有刷新相同的.. 模型对象:
我为自定义控件创建了一个 .cs 类,其中包含以下属性: //Property which is defining the unit of the textblock in the Ringsli
有谁知道是否可以对基于 IValueConverter 的类进行数据绑定(bind)? 我有以下转换器: [ValueConversion(typeof(int), typeof(Article))]
好吧,(在写了几次之后)发现System.Windows.Controls命名空间中已经有一个BooleanToVisibilityConverter,这真是一个惊喜。 可能还有更多这样隐藏的节省时间
我有这个代码: namespace Test { public partial class SearchField : UserControl { public Sea
我需要在转换器类中定义 DependencyProperty,因为我需要此数据来进行转换,并且此数据位于另一个对象中,而不是我绑定(bind)到的对象中。 我的转换器类如下: public class
我有这个代码: namespace Test { public partial class SearchField : UserControl { public Sea
我是一名优秀的程序员,十分优秀!