2017-06-07 2 views
1

J'ai essayé de passer un UserControl à travers les limites AppDomain et remarqué un comportement étrange avec FrameworkElementAdapters.ViewToContractAdapter() et ContractToViewAdapter(). Après que le INativeHandleContract a été reconverti en FrameworkElement en utilisant FrameworkElementAdapters.ContractToViewAdapters(), le UserControl enveloppé ne change plus sa taille si l'un de ses enfants grandit.WPF UI AddIn ne pas mettre à jour sa taille

Ce comportement peut être facilement démontrée à l'aide d'un simple, vide, fenêtre WPF:

public partial class MainWindow : Window 
{ 
    private ListBox listBox; 
    private Button myButton; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     listBox = new ListBox(); 
     Content = listBox; 

     myButton = new Button { Content = "Click me" }; 
     myButton.Click += (sender, args) => myButton.Content = "Lorem ipsum dolor sit amet."; 
     myButton.SizeChanged += (sender, args) => Debug.WriteLine($"{myButton.DesiredSize}"); 
     //listBox.Items.Add(myButton); 

     var frameworkElement = FrameworkElementAdapters.ContractToViewAdapter(FrameworkElementAdapters.ViewToContractAdapter(myButton)); 
     listBox.Items.Add(frameworkElement); 
    } 
} 

Si vous cliquez sur le bouton, le texte change comme prévu. Cependant, le bouton ne se redimensionne pas, ce qui vous laisse un texte tronqué. Si vous commentez les deux dernières lignes et ajoutez simplement le bouton, cela fonctionnera comme prévu.

Je pense que c'est fondamentalement le même problème que dans this cas, mais il ne semble pas y avoir de solution. Est-ce que quelqu'un a une idée de comment se débarrasser de cela?

Merci d'avance!

+0

J'ai réussi à modifier le comportement en encapsulant le bouton dans une grille. Vous avez seulement besoin d'avoir une taille automatique ColumnDefinition et RowDefinition. Maintenant, au moins, le bouton à l'intérieur du HwndHost/FrameworkElement semble changer sa taille. – edsplash

Répondre

0

Comme mentionné dans mon commentaire, tout emballage en plus dans un Grid semble faire l'affaire ou, au moins, vous permet de recevoir un événement SizeChanged que vous pouvez ensuite utiliser pour redimensionner le FrameworkElement résultant.

public partial class MainWindow : Window 
{ 
    private ListBox listBox; 
    private Button myButton; 
    private Grid dummyGrid; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     listBox = new ListBox(); 
     Content = listBox; 

     myButton = new Button { Content = "Click me" }; 
     myButton.Click += (sender, args) => 
     { 
      myButton.Content = "Lorem ipsum dolor sit amet."; 
      myButton.FontSize = 24; 
     }; 

     dummyGrid = new Grid(); 
     dummyGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Auto }); 
     dummyGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }); 
     dummyGrid.Children.Add(myButton); 

     var frameworkElement = 
      FrameworkElementAdapters.ContractToViewAdapter(
       FrameworkElementAdapters.ViewToContractAdapter(dummyGrid)); 
     listBox.Items.Add(frameworkElement); 

     // Automatically adjust HwndHost's size when the grid changes 
     dummyGrid.SizeChanged += (sender, args) => 
     { 
      frameworkElement.Width = args.NewSize.Width; 
      frameworkElement.Height = args.NewSize.Height; 
     };    
    } 
} 

Dans mon cas, je devais faire de la magie pour obtenir l'événement pour passer à travers les limites de AppDomain (par exemple SizeChangedEventArgs pas beeing sérialisable etc.).