Pergunta

Eu preciso definir uma propriedade de dependência em um controle (Slider.Value) no meu código sem ele desencadear um evento ValueChanged (desde que eu definir o valor, não o usuário). Qual é a melhor maneira de lidar com esta situação no WPF?

Para esclarecimento, o que estou tentando fazer é ligar sliders WPF a um WinForms Controle do Usuário. Actualmente no meu aplicativo eu tenho um manipulador de eventos ValueChanged que passa o valor controle deslizante para o controle WinForms através de uma chamada de método. O controle WinForms (que na verdade é um invólucro em torno de uma janela OpenGL nativo) precisa ser capaz de alterar dinamicamente o controle deslizante com base em sua cálculos internos. Para fazer isso eu uso uma abstração de um controle deslizante (iSlider), eu instanciar um WPF sabor desse controle deslizante em meu aplicativo, e passar um identificador para a sua base para as WinForms controlar através de uma propriedade .NET no WinForms User Control. Tudo isso está trabalhando atualmente, é apenas que, quando a lógica interna decide as necessidades controle deslizante para alterar, ele chama iSlider :: setpos (), que, em seguida, muda o controle deslizante WPF, que então aciona um evento ValueChanged no controle deslizante, e o manipulador para esse evento extrai a posição do cursor e passa-o para o controle WinForms que originou o evento em primeiro lugar. As sugestões por ligaz e Alan tanto Le parece que eles devem trabalhar, mas eu não sou apenas certo que eu vou sobre isso da melhor maneira.

Foi útil?

Solução

Aqui está uma simples solução / hack. Adicionar um booleano para controlar se você alterou a configuração, vamos dizer "IsChangedByMe". Quando você altera a propriedade de dependência em código, definir o bool para true. No caso ValueChanged, se IsChangedByMe é verdade, não fazer nada.

Outras dicas

Você tem certeza que quer realmente fazer isso? Se há um pedaço de UI databound a essa propriedade e você permitir alterar o valor sem disparar o evento ValueChanged você rapidamente acabar com sua interface do usuário não está mais sincronizado com os dados.

No caso de seu controle deslizante, imagine o usuário coloca-lo em 75%. Agora o seu código muda para 10% no fundo, mas suprime a notificação de alteração. Ele ainda olha na tela como se fosse a 75% (uma vez que não foi dito que mudou), mas ele está sendo usado como 10% pelo código que está sendo executado. Soa como uma receita para a confusão.

Uma possível solução é derivar Slider e override OnValueChanged (...) . Quando você não quer aumentar o evento que você deve fazer nada, caso contrário, você deve chamar a implementação base.

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