我的窗口有两种不同的样式:
对于我的开发机器上的任何一个显示器,窗口太宽,但它非常适合目标/安装机器。因此,在调试时,我需要能够移动窗口以便我可以看到它上面的所有内容,但是当我发布应用程序时,我需要它以“全屏”模式运行(就像投影仪模式下的PowerPoint应用程序)。
有没有办法根据我是否在Debug与Release模式下编译来设置窗口的Style
属性?我以为我可以使用绑定,但我不太确定如何实现它。
答案 0 :(得分:11)
创建一个样式选择器类:
namespace WpfApplication1
{
public class DebugReleaseStylePicker
{
#if DEBUG
internal static readonly bool debug = true;
#else
internal static readonly bool debug=false;
#endif
public Style ReleaseStyle
{
get; set;
}
public Style DebugStyle
{
get; set;
}
public Style CurrentStyle
{
get
{
return debug ? DebugStyle : ReleaseStyle;
}
}
}
}
在您的App.xaml中添加到您的Application.Resources你的调试和发布样式+ StylePicker的一个实例,并将ReleaseStyle和DebugStyle设置为以前的设置样式:
<Application.Resources>
<Style x:Key="WindowDebugStyle">
<Setter Property="Window.Background" Value="Red"></Setter>
</Style>
<Style x:Key="WindowReleaseStyle">
<Setter Property="Window.Background" Value="Blue"></Setter>
</Style>
<WpfApplication1:DebugReleaseStylePicker x:Key="stylePicker"
ReleaseStyle="{StaticResource WindowReleaseStyle}"
DebugStyle="{StaticResource WindowDebugStyle}"/>
</Application.Resources>
在你的Window标记中设置WindowStyle,如下所示:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Style="{Binding Source={StaticResource stylePicker}, Path=CurrentStyle}">
..
</Window>
您可以重复使用DebugReleaseStylePicker将样式设置为任何其他控件而不仅仅是Window。
答案 1 :(得分:5)
在XAML中可能很难做到,但在实际代码中你可以做类似的事情:
#if DEBUG
window.Style = WindowStyles.Regular;
#endif
为什么不把它放在执行普通XAML代码后执行的地方?
答案 2 :(得分:3)
你可以像这样创建一个标记扩展名:
public class DebugStyleExtension : MarkupExtension
{
public object DebugResourceKey { get; set; }
public object ReleaseResourceKey { get; set; }
public object ProvideValue(IServiceProvider provider)
{
#if DEBUG
return Application.Current.FindResource(DebugResourceKey) as Style;
#else
return Application.Current.FindResource(ReleaseResourceKey) as Style
#endif
}
}
你会像那样使用它:
<Window ...
xmlns:my="clr-namespace:MyNamespace"
Style="{my:DebugStyle DebugResourceKey=DebugStyle, ReleaseResourceKey=NormalStyle}">
答案 3 :(得分:2)
您可以在XAML文件和代码隐藏中进行条件编译。 check out this article
基本上,你在Properties \ AssemblyInfo.cs中这样做:
#if BETA
[assembly:XmlnsDefinition("BetaVersion", "Example.Technology")]
#endif
将您的xmlns添加到* .XAML文件中:
xmlns:beta="BetaVersion"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
现在,您可以这样做:
<mc:Choice Requires="beta">
<Label>
This is ALPHA software. Confidential.
Internal use only. Do not distribute
<Label>
</mc:Choice>
作为附注,这可能不适用于silverlight - AFIK不支持assembly:XmlnsDefinition
答案 4 :(得分:0)
你能使用#if DEBUG将属性设置为不同的值并绑定到它吗?
也许
#if DEBUG
style = 0;
#else
style = 1;
#endif
(请记住我这里没有VS.)并使用值转换器。
答案 5 :(得分:0)
很多有用的答案......我想到了另外一个我认为我会抛弃的想法:一个值转换器加上一个绑定:
这是价值转换器:
public class WindowToWindowStyle : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var window = (Window)value;
var style = (Style)window.FindResource("Window_FixedStyle");
#if DEBUG
style = (Style)window.FindResource("Window_Style");
#endif
return style;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
这是我的窗口声明:
<Window
...
xmlns:local="clr-namespace:MyProj"
Style="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource ValueConverter_WindowToWindowStyle}}"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<local:WindowToWindowStyle
x:Key="ValueConverter_WindowToWindowStyle" />
</Window.Resources>
...
</Window>
这是做什么的:
所以,这里发生的是我将对Window本身的引用传递给值转换器,并返回相应的样式。