Как у меня может быть использование WPF один стиль окна для Режима отладки и другой для режима Release?

Canon обеспечивает драйверы, которые печатают дуплекс на серии MG5300 на азиатских серверах.

Их рекомендуемый метод установки перестал работать, но иначе доступен.

то, Как сделать это, детализировано в в другом ответ вопросов.

7
задан GEOCHET 3 September 2009 в 18:41
поделиться

6 ответов

Создайте класс выбора стиля:

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 добавьте в свое приложение. 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, чтобы установить стиль для любого другого элемента управления, а не только для окна.

11
ответ дан 6 December 2019 в 08:44
поделиться

Это может быть сложно сделать в XAML, но в реальном коде вы можете просто сделать что-то вроде:

#if DEBUG
    window.Style = WindowStyles.Regular;
#endif

Почему бы не поместить это где-нибудь, что будет выполняться после того, как будет выполнен нормальный код XAML казнен?

5
ответ дан 6 December 2019 в 08:44
поделиться

вы можете выполнять условную компиляцию в файле XAML, а также в коде. ознакомьтесь с этой статьей

в основном, вы делаете это в своем 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 сборка : XmlnsDefinition не поддерживается

2
ответ дан 6 December 2019 в 08:44
поделиться

Вы можете создать расширение разметки вроде этого:

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
ответ дан 6 December 2019 в 08:44
поделиться

Не могли бы вы использовать #if DEBUG, чтобы установить для свойства другое значение и привязать к нему?

Может быть

#if DEBUG
style = 0;
#else
style = 1;
#endif

(Имейте в виду, что у меня здесь нет VS). и используйте преобразователь значений.

0
ответ дан 6 December 2019 в 08:44
поделиться

Множество полезных ответов ... Я подумал о другой идее, которую я хотел бы выбросить там: преобразователь значений плюс привязка:

Вот преобразователь значений:

    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:

<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 в преобразователь значений и возвращает соответствующий стиль.

0
ответ дан 6 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: