Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在XAML中,d的反面是什么:(设计时间)_C#_Wpf_Blend - Fatal编程技术网

C# 在XAML中,d的反面是什么:(设计时间)

C# 在XAML中,d的反面是什么:(设计时间),c#,wpf,blend,C#,Wpf,Blend,我非常喜欢用d:XYZ方法在设计时标记某些属性,这样它们就可以在混合中显示,而不是在我的程序真正运行时显示 d的反面是什么?我的目标是有两种不同的行为,一种是在设计模式下,另一种是在实际运行时 例如,我希望“TestTest”在运行时显示,但“productionTest”在运行时显示 <TextBlock x:Name="FileText" TextWrapping="Wrap" d:Text="TestTest"

我非常喜欢用d:XYZ方法在设计时标记某些属性,这样它们就可以在混合中显示,而不是在我的程序真正运行时显示

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

例如,我希望“TestTest”在运行时显示,但“productionTest”在运行时显示

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

就像刺猬说的那样。。。相反的情况是:不要使用它

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

<Window ...
    Height="600"  Width="800"
    d:Height="200"  d:Width="300" >
然后,您可以根据
IsInDesignMode
变量拥有不同的值,因此您可以实现不同的数据服务,将虚拟数据提供给您的设计(比如随机日期列表),并将真实数据提供给您的运行时(例如,数据库中的真实日期)。
这样,您就不必为设计/运行时的每个页面担心,因为框架将为您分类并为您提供正确的数据


编辑:
根据你的评论。。。你不能那样做。您要么需要依赖一些编码(选项1,越长),要么依赖一些框架(选项2,我认为更好)。
在每种情况下,您的XAML都将如下所示:

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

现在,根据框架的
IsInDesignMode

d
只是混合XML名称空间的一个名称,字符串将被绑定到正确的值:
xmlns:d=”http://schemas.microsoft.com/expression/blend/2008“
。它不是一般的“选项”,而是具有具体属性的具体名称空间:
这是一个详尽的列表,没有对立的地方。

您可以使用下面的类

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那样从编译中排除)

离开d:?“离开”是d:?:D:完成的策略是使用设计时视图模型,其形状与运行时视图模型类似。然后将其绑定到数据上下文,如。。。d:DataContext=“{d:DesignData/SampleData/SerializedSampleData.xaml}”DataContext=“{local:ViewModel}”执行此操作后,绑定到DataContext的所有内容都将相同。设计/运行时之间无需更改。列出的代码是否有效?有什么问题吗?嘿,谢谢Noctis,我更新了我的问题,让它更清楚一点-有什么提示如何让测试文本出现吗?
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'}" />