在XAML中与d相反:(设计时间)

时间:2013-11-09 20:06:04

标签: c# wpf blend

我非常喜欢用于标记某些属性设计时间的d:XYZ方法,这样它们出现在Blend中,但在我的程序运行真实时却没有出现

与d相反:?我的目标是有两种不同的行为,一种是在设计模式,另一种是在真实运行时?

例如,我希望“TestTest”出现Blend,但“productionTest”出现在运行时

<TextBlock x:Name="FileText" 
           TextWrapping="Wrap" 
           d:Text="TestTest" 
           Text="productionTest" 
           HorizontalAlignment="Center"/>

3 个答案:

答案 0 :(得分:4)

d只是Blend XML名称空间的名称:xmlns:d="http://schemas.microsoft.com/expression/blend/2008"。它不是通用的“选项”,而是具有特定属性的具体名称空间:http://msdn.microsoft.com/en-us/library/ff602277(v=vs.95).aspx 这是详尽的清单,没有对立面。

答案 1 :(得分:3)

就像开发hedgehog所说的那样......相反的是:不使用它。

使用d:用于设计模式,因此您可以使用以下内容:

<Window ...
    Height="600"  Width="800"
    d:Height="200"  d:Width="300" >

并且在设计和运行时都有不同的设计高度/宽度。

一些框架实际上会帮助你,并通过做类似的事情(这个例子特别来自MVVM-Light框架):

DataContext="{Binding Main, Source={StaticResource Locator}}"

您可以根据IsInDesignMode变量设置不同的值,这样您就可以实现不同的数据服务,将虚拟数据提供给您的设计(假设是一个随机日期列表),并为您的运行提供真实数据时间(例如,数据库中的实际日期) 这样,您就不必担心设计/运行时的每个页面,因为框架会为您排序并为您提供正确的数据。


修改
根据你的意见......你不能这样做。你要么必须转发一些编码(选项1,更长),或某些框架(选项2,在我看来更好)。
在每种情况下,您的XAML将如下所示:

<TextBlock x:Name="FileText" 
       TextWrapping="Wrap" 
       Text="{Binding BlendabilityText}" 
       />

当然,您的模型需要public string BlendabilityText { get; set; }

选项1:
您需要使用以下属性创建视图模型:'public string BlendabilityText {get;组; }',并且有2个构造函数。默认为空的,即默认情况下处于设计模式时调用的内容,您可以在其中初始化属性,如BlendabilityText = "TestTest"; 在您应该调用运行时模式的第二个构造函数中,您应该对BlendabilityText = "ProductionValue";值执行相同的操作。
现在你应该看到正确的输出。

选项2: 使用MVVM-Light框架,您可以使用IsInDesignMode初始化您的属性,将其放在构造函数中:

if (IsInDesignMode)
{
    BlendabilityText = "TestTest";
}
else
{
    BlendabilityText = "ProductionTest";
}

现在,根据框架的IsInDesignMode,您的字符串会被限制为正确的值。

答案 2 :(得分:2)

您可以使用以下课程

public class Design : MarkupExtension
{
    readonly object realValue;
    readonly object designValue;

    public Design(object realValue, object designValue)
    {
        this.realValue = realValue;
        this.designValue = designValue;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var target = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
        if (target != null && target.TargetObject != null)
        {
            var obj = target.TargetObject as DependencyObject;
            if (obj != null && DesignerProperties.GetIsInDesignMode(obj))
                return designValue;
        }
        return realValue;
    }
}
像这样

<TextBlock Text="{my:Design 'Real value', 'Design value'}" />

然而,这仍然具有(小)性能开销(因为这不会像d:XYZ那样被排除在编译之外)