Accès au ScrollViewer d'un ListBox à partir de C #
Je voudrais changer les propriétés d'un ScrollViewer
d'un ListBox
à partir de C#.
J'ai trouvé cette question ici sur Stackoverflow. J'ai pris la accepté de répondre à des conseils et de l'exposé de la ScrollViewer
en tant que propriété d'une sous-classe. Toutefois, cela ne semble pas être à travailler dans l'exemple illustré ci-dessous. Certains commentaires que la question aussi de l'état que cette technique ne fonctionne pas.
XAML:
<Window x:Class="StackoverflowListBoxScrollViewer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
</Window>
C#:
using System;
using System.Windows;
using System.Windows.Controls;
namespace StackoverflowListBoxScrollViewer
{
public class MyListBox : ListBox
{
public ScrollViewer ScrollViewer
{ get { return (ScrollViewer)GetTemplateChild("ScrollViewer"); } }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var myListBox = new MyListBox();
Content = myListBox;
myListBox.Items.Add(new Button() { Content = "abc" });
myListBox.Items.Add(new Button() { Content = "abc" });
myListBox.Items.Add(new Button() { Content = "abc" });
myListBox.Items.Add(new Button() { Content = "abc" });
myListBox.Items.Add(new Button() { Content = "abc" });
var button = new Button() { Content = "Check ScrollViewer" };
button.Click += (s, e) =>
{
if (myListBox.ScrollViewer == null)
Console.WriteLine("null");
};
myListBox.Items.Add(button);
}
}
}
Lorsque je clique sur "Check " ScrollViewer" bouton, il affiche "null". I. e., le ScrollViewer
n'était pas récupérés.
Comment puis-je obtenir ce fameux ScrollViewer
? 🙂
source d'informationauteur dharmatech
Vous devez vous connecter pour publier un commentaire.
Si vous allez utiliser la ListBox, de sorte que vous pouvez changer la vôtre de lecture de celui-ci:
vous pouvez essayer cette petite aide de la fonction
utilisation
fonction d'assistance
Espère que cette aide
J'ai modifié la grande réponse de @punker76 pour créer une méthode d'extension pour Visual et explicite le type de retour:
Vous pouvez maintenant appeler par SomeVisual.GetDescendantByType et il retourne soit déjà une bonne tapé ScrollViewer ou null (qui est par défaut(T))
Comme pour moi, d'exposer ScrollViewer comme une propriété est une mauvaise idée. Tout d'abord, il n'y a aucune garantie que ScrollViewer existe dans un modèle. Deuxièmement, ScrollViewer fonctionne en synchronisation avec ItemsPanel et ItemContainerGenerator. Substitution de ce qui est la voie droite de comportement rare.
Contrôles WPF utiliser un autre modèle. Leurs classes sont comme des médiateurs entre l'extérieur logique d'utilisation et l'intérieur de la représentation visuelle. Votre zone de liste doit exposer les propriétés qui peuvent être utilisées par les ScrollViewer dans un modèle, mais pas ScrollViewer. En faisant cela, vous rompre WPF normes, de restreindre votre contrôle pour le modèle spécifique, et permet à l'utilisateur de code pour pirater interne ListBox mise en œuvre.
Voici un autre retravaillé et version générique de @punker76 réponse pour C# 6: