3

我真的很喜欢用于标记某些属性设计时间的 d:XYZ 方法,这样它们会出现在 Blend 中,但不会在我的程序真正运行时出现

d: 的反义词是什么?我的目标是有两种不同的行为,一种是在设计模式下,另一种是在实际运行时?

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

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

3 回答 3

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 这是详尽的列表,有没有对立面。

于 2013-11-19T04:26:30.480 回答
3

就像开发刺猬说的那样……相反的是:不要使用它。

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.

于 2013-11-10T03:33:53.220 回答
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 那样从编译中排除)

于 2013-11-20T13:13:39.203 回答