¿Puedo retrasar el enlace de un elemento ui si el elemento no está visible actualmente? A veces tengo un formulario que tiene algunos elementos ocultos/minimizados, me gustaría no actualizarlos si no están en la pantalla. Sospecho que la respuesta es no, pero nunca está de más preguntar?WPF: detener el enlace si un elemento de la interfaz de usuario no está visible
Respuesta
No hay una forma integrada para hacerlo, pero puede escribirlo usted mismo.
El truco es envolver la unión en su propia extensión de marcado que utiliza la unión original, pero añade un nuevo comportamiento alrededor de ella (por ejemplo, mediante el establecimiento de UpdateSourceTrigger explícita cuando no se desea la unión a trabajar.
he aquí un ejemplo (que retrasa la transferencia de datos de enlace):
http://www.paulstovell.com/wpf-delaybinding
Ahora, hay una gran cantidad de posibles condiciones de borde con la desactivación fijaciones para los controles invisibles, especialmente alrededor de mostrar y ocultar los controles, para que no me escriba una extensión genérica para esto, pero puede estar en su aplicación específica esto puede ser útil.
eso es extraño, escribí algo similar - http://www.codeproject.com/KB/WPF/DelayedBindingTextBox.aspx –
La respuesta es no porque el enlace podría ser la causa de volver a hacer visible un elemento. Por lo tanto, si el enlace no funciona en los controles ocultos, no permitiría que el enlace lo haga visible de nuevo.
Para una solución alternativa tengo un enlace a la visibilidad del objeto, cuando el objeto se establece en visible, la propiedad desencadena la construcción del elemento detrás de él que tiene un enlace a través de ContentPresenter
.
Sé que esta es una vieja pregunta, pero como no pude encontrar una clase implementada o algo así, lo hice yo mismo, siguiendo @Nir respuesta.
Ésta es una extensión de marcado que se envuelve unión normal sólo se unen realmente cuando la propiedad del objeto IsVisible
se convierte en realidad por primera vez:
using System;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace MakupExtensions {
[MarkupExtensionReturnType(typeof(object))]
public class LazyBindingExtension : MarkupExtension {
public LazyBindingExtension() {
}
public LazyBindingExtension(PropertyPath path) : this() {
Path = path;
}
public IValueConverter Converter {
get;
set;
}
[TypeConverter(typeof(CultureInfoIetfLanguageTagConverter))]
public CultureInfo ConverterCulture {
get;
set;
}
public object ConverterParamter {
get;
set;
}
public string ElementName {
get;
set;
}
[ConstructorArgument("path")]
public PropertyPath Path {
get;
set;
}
public RelativeSource RelativeSource {
get;
set;
}
public object Source {
get;
set;
}
public UpdateSourceTrigger UpdateSourceTrigger {
get;
set;
}
public bool ValidatesOnDataErrors {
get;
set;
}
public bool ValidatesOnExceptions {
get;
set;
}
public bool ValidatesOnNotifyDataErrors {
get;
set;
}
private Binding binding;
private DependencyObject bindingTarget;
private DependencyProperty bindingTargetProperty;
public override object ProvideValue(IServiceProvider serviceProvider) {
var valueProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (valueProvider != null) {
bindingTarget = valueProvider.TargetObject as DependencyObject;
bindingTargetProperty = valueProvider.TargetProperty as DependencyProperty;
if (bindingTargetProperty == null || bindingTarget == null) {
throw new NotSupportedException($"The property '{valueProvider.TargetProperty}' on target '{valueProvider.TargetObject}' is not valid for a LazyBinding. The LazyBinding target must be a DependencyObject, and the target property must be a DependencyProperty.");
}
binding = new Binding {
Path = Path,
Converter = Converter,
ConverterCulture = ConverterCulture,
ConverterParameter = ConverterParamter
};
if (ElementName != null) {
binding.ElementName = ElementName;
}
if (RelativeSource != null) {
binding.RelativeSource = RelativeSource;
}
if (Source != null) {
binding.Source = Source;
}
binding.UpdateSourceTrigger = UpdateSourceTrigger;
binding.ValidatesOnDataErrors = ValidatesOnDataErrors;
binding.ValidatesOnExceptions = ValidatesOnExceptions;
binding.ValidatesOnNotifyDataErrors = ValidatesOnNotifyDataErrors;
return SetBinding();
}
return null;
}
public object SetBinding() {
var uiElement = bindingTarget as UIElement;
if (uiElement != null && !uiElement.IsVisible) {
uiElement.IsVisibleChanged += UiElement_IsVisibleChanged;
}
else {
ConsolidateBinding();
}
return bindingTarget.GetValue(bindingTargetProperty);
}
private void ConsolidateBinding() => BindingOperations.SetBinding(bindingTarget, bindingTargetProperty, binding);
private void UiElement_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) {
var uiElement = sender as UIElement;
if (uiElement != null && uiElement.IsVisible) {
uiElement.IsVisibleChanged -= UiElement_IsVisibleChanged;
ConsolidateBinding();
}
}
}
}
de usar:
<ItemsControl ItemsSource="{mx:LazyBinding Documents}"/>
En este ejemplo, solo se vinculará cuando ItemsControl IsVisible
se haga verdadero por primera vez.
No se desvinculará cuando el IsVisible
vuelva a ser falso, pero creo que alguien puede cambiarlo si es necesario.
MarkupExtension mejorado que ajusta el enlace normal al modelo de datos de vinculación/desvinculación automática, si está visible cambiado.
Ver la versión anterior here.
using System;
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace UtilsWPF
{
[MarkupExtensionReturnType(typeof(object))]
public class LazyBindingExtension : MarkupExtension
{
public LazyBindingExtension()
{ }
public LazyBindingExtension(PropertyPath path) : this()
{
Path = path;
}
#region Properties
public IValueConverter Converter { get; set; }
[TypeConverter(typeof(CultureInfoIetfLanguageTagConverter))]
public CultureInfo ConverterCulture { get; set; }
public object ConverterParamter { get; set; }
public string ElementName { get; set; }
[ConstructorArgument("path")]
public PropertyPath Path { get; set; }
public RelativeSource RelativeSource { get; set; }
public object Source { get; set; }
public UpdateSourceTrigger UpdateSourceTrigger { get; set; }
public bool ValidatesOnDataErrors { get; set; }
public bool ValidatesOnExceptions { get; set; }
public bool ValidatesOnNotifyDataErrors { get; set; }
private Binding binding;
private UIElement bindingTarget;
private DependencyProperty bindingTargetProperty;
#endregion
#region Init
public override object ProvideValue(IServiceProvider serviceProvider)
{
var valueProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
if (valueProvider != null)
{
bindingTarget = valueProvider.TargetObject as UIElement;
if (bindingTarget == null)
{
throw new NotSupportedException($"Target '{valueProvider.TargetObject}' is not valid for a LazyBinding. The LazyBinding target must be a UIElement.");
}
bindingTargetProperty = valueProvider.TargetProperty as DependencyProperty;
if (bindingTargetProperty == null)
{
throw new NotSupportedException($"The property '{valueProvider.TargetProperty}' is not valid for a LazyBinding. The LazyBinding target property must be a DependencyProperty.");
}
binding = new Binding
{
Path = Path,
Converter = Converter,
ConverterCulture = ConverterCulture,
ConverterParameter = ConverterParamter
};
if (ElementName != null)
{
binding.ElementName = ElementName;
}
if (RelativeSource != null)
{
binding.RelativeSource = RelativeSource;
}
if (Source != null)
{
binding.Source = Source;
}
binding.UpdateSourceTrigger = UpdateSourceTrigger;
binding.ValidatesOnDataErrors = ValidatesOnDataErrors;
binding.ValidatesOnExceptions = ValidatesOnExceptions;
binding.ValidatesOnNotifyDataErrors = ValidatesOnNotifyDataErrors;
return SetBinding();
}
return null;
}
public object SetBinding()
{
bindingTarget.IsVisibleChanged += UiElement_IsVisibleChanged;
updateBinding();
return bindingTarget.GetValue(bindingTargetProperty);
}
#endregion
#region Event Handlers
private void UiElement_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
updateBinding();
}
#endregion
#region Update Binding
private void updateBinding()
{
if (bindingTarget.IsVisible)
{
ConsolidateBinding();
}
else
{
ClearBinding();
}
}
private bool _isBind;
private void ConsolidateBinding()
{
if (_isBind)
{
return;
}
_isBind = true;
BindingOperations.SetBinding(bindingTarget, bindingTargetProperty, binding);
}
private void ClearBinding()
{
if (!_isBind)
{
return;
}
BindingOperations.ClearBinding(bindingTarget, bindingTargetProperty);
_isBind = false;
}
#endregion
}
}
Para usar:
<ItemsControl ItemsSource="{utils:LazyBinding Documents}"/>
- 1. Selenium C# Webdriver Cómo detectar si el elemento está visible
- 2. WPF Trigger no establecerá propiedad si está configurado en Elemento
- 3. cómo obtener el valor de rotación de un elemento de interfaz de usuario en WPF
- 4. jQuery si está visible
- 5. Detectar si un elemento es realmente visible
- 6. WPF interfaz de usuario no actualizados al cambio de propiedad
- 7. WPF Barra de desplazamiento horizontal no está visible
- 8. WPF. ¿Cómo detener la animación de activación de datos a través del enlace?
- 9. JQuery: compruebe si un elemento está oculto del usuario
- 10. Comprobar si el elemento es visible en la pantalla
- 11. Detectar si un cuadro de diálogo de la interfaz de usuario de jQuery está abierto
- 12. Cómo comprobar si un elemento está en la vista del usuario con jquery
- 13. Compruebe si la ubicación del usuario está visible en el mapa iphone
- 14. No hay error de interfaz visible
- 15. Cómo implementar la interfaz de usuario dinámica de WPF
- 16. Cómo verificar si una NSWindow está visible
- 17. ¿Cómo probar una interfaz de usuario WPF?
- 18. Cómo evitar que un elemento secundario se recorte si el desbordamiento de los padres no está visible?
- 19. WPF ListBox SelectedItem a veces no es visible (desplazamiento está fuera de sincronización)
- 20. Interfaz de usuario de jQuery Block: nodo no está definido
- 21. Si el elemento está sobre otro elemento?
- 22. Enlace a una propiedad de un elemento principal en wpf
- 23. Verifique si div completo es visible para el usuario
- 24. Verificar si la barra de estado está oculta o visible
- 25. Jquery: matriz simple, empujando el elemento si ya no está allí, eliminando el elemento si está allí
- 26. Pautas de la interfaz de usuario con pantalla táctil WPF
- 27. ¿Cómo puedo actualizar la interfaz de usuario en MVVM WPF
- 28. ¿Cómo me deshago del rectángulo rojo cuando la validación de mi enlace wpf ha fallado y el panel contenedor ya no está visible?
- 29. jQuery - Verifique si div infantil está visible
- 30. knockout.js cambiar el estado visible en función de si la matriz está vacía o no
¿Por qué quieres hacer eso? para el rendimiento? –
sí el rendimiento, es en realidad la pereza (la pereza es la madre de la invención) porque debería eliminar cosas del árbol si no son visibles, para obtener el rendimiento que necesito. –