Pergunta

No meu programa eu tenho três estados distintos UI (normal, Sucesso, e erro) e em cada um dos controles são visíveis / ocultos, ativado / desativado, a mudança cores, rótulos dizem coisas diferentes ... etc. e no meu código-behind Basicamente, eu quero ser capaz de dizer ChangeWindowState (UI.Normal);

Assim, a minha pergunta é a melhor forma de implementar as mudanças de controle para cada estado?

É claro que eu poderia mudar manualmente os controles no código-behind, mas me pergunto se talvez haja uma maneira melhor usando WPF temas ou estilos. Então talvez eu poderia apenas definir a janela para usar o tema "Erro", que tem pré-definido. Eu realmente não entendê-los no momento em que eu possa estar usando o errado terminologia, mas eu apreciaria se alguém pudesse me aponte na direção certa a melhor forma de fazer algo assim.

Obrigado!

Foi útil?

Solução

Há muitas maneiras de abordar esta questão, é claro. Se você tivesse um "modelo de objeto" estado-programa que você poderia usar alguma combinação de DataTemplates e DataTriggers. Assumindo que este não é o caso, aqui está uma outra abordagem: Você se refere a uma janela, por isso suponho que você definir uma "propriedade de dependência" em sua classe de janela como esta:

public partial class Window1 : Window
{
    public Window1()
    {
        this.InitializeComponent();

        // Insert code required on object creation below this point.
    }

    public ProgramStatus ProgramStatus
    {
        get { return (ProgramStatus)GetValue(ProgramStatusProperty); }
        set { SetValue(ProgramStatusProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ProgramStatus.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ProgramStatusProperty =
        DependencyProperty.Register("ProgramStatus", typeof(ProgramStatus), typeof(Window1), new UIPropertyMetadata(null));
}

public enum ProgramStatus
{
    Normal,
    Success,
    Error
}

Agora você pode mudar praticamente qualquer propriedade de qualquer elemento da janela (incluindo a própria janela), por qualquer ligação directa ou um gatilho. Aqui está um exemplo de mudança de cor de fundo da janela através de um disparador de propriedade:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:l="clr-namespace:Test"
    x:Class="Test.Window1"
    x:Name="Window"
    Title="Window1"
    Width="640" Height="480">
    <Window.Style>
        <Style TargetType="{x:Type l:Window1}">
            <Style.Triggers>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Error</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Red" />
                </Trigger>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Normal</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Blue" />
                </Trigger>
                <Trigger Property="ProgramStatus">
                    <Trigger.Value>
                        <l:ProgramStatus>Success</l:ProgramStatus>
                    </Trigger.Value>
                    <Setter Property="Background" Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Style>
    <Grid x:Name="LayoutRoot"/>
</Window>

Outras dicas

Outra opção para você possivelmente é o VisualStateManager que foi lançado como parte do WPFToolkit.

Mais informações é através destes links:

Boa sorte.

Para este tipo de coisa que eu praticamente sempre feita uma função "updateUI ()". Esta função olha para o estado do modelo / propriedades do membro / estado e activa / desactiva, couros / shows, qualquer que seja. Tentando espalhar este código fora sempre leva a um problema (assim "ChangeWindowsState (..)" realmente apenas define uma propriedade e, em seguida, chama de "updateUI ()").

Eu vi algumas tentativas de lidar com isso de uma forma genérica ... mas nenhum que eu realmente gostei (por exemplo, o material WTL). Geralmente estes não são mal implementado ... mas apenas fácil de ultrapassar rapidamente o que eles podem fazer. E, geralmente, a lógica do estado é suficiente importante que ter explicitamente codificado com simples if / then / else ligações lógicas estilo para menos confusão (manutenção, depuração, etc).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top