ListBox 항목을 두 번 클릭하여 브라우저를 엽니다.
나는 가지고 있다ListBox
WPF 창으로 바인드되어 있습니다.ObervableCollection
브라우저의 요소를 클릭하면 브라우저를 열고 싶다.ListBox
(링크와 같습니다).이거 어떻게 하는지 누가 좀 알려주시겠어요?listbox views를 사용하여 검색했습니다.이렇게만 동작하나요?아니면 그냥 사용하는 방법이 있나요?ListBox
?
당신의
세바스찬
ListBox에 스타일을 추가할 수 있습니다.Item Container Style 및 EventSetter를 추가합니다.
<ListBox>
....
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
List Box Item_Mouse Double Click은 코드 뒤에 있는 Mouse Double Click의 올바른 서명을 가진 메서드입니다.
코드 배후에 있는 listBoxItem 더블클릭 이벤트를 처리할 필요 없이 이 문제를 해결하고 싶었기 때문에 listBoxItem 스타일을 덮어쓰거나 처음부터 덮어쓸 스타일을 정의하고 싶지 않았습니다.listBox를 더블클릭 했을 때 명령어를 실행하려고 했습니다.
다음과 같은 첨부 속성을 작성했습니다(코드는 매우 구체적이지만 필요에 따라 일반화할 수 있습니다).
public class ControlItemDoubleClick : DependencyObject
{
public ControlItemDoubleClick()
{
}
public static readonly DependencyProperty ItemsDoubleClickProperty = DependencyProperty.RegisterAttached("ItemsDoubleClick", typeof(bool), typeof(Binding));
public static void SetItemsDoubleClick(ItemsControl element, bool value)
{
element.SetValue(ItemsDoubleClickProperty, value);
if (value)
{
element.PreviewMouseDoubleClick += new MouseButtonEventHandler(element_PreviewMouseDoubleClick);
}
}
static void element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var control = sender as ItemsControl;
foreach (InputBinding b in control.InputBindings)
{
if (!(b is MouseBinding))
{
continue;
}
if (b.Gesture != null
&& b.Gesture is MouseGesture
&& ((MouseGesture)b.Gesture).MouseAction == MouseAction.LeftDoubleClick
&& b.Command.CanExecute(null))
{
b.Command.Execute(b.CommandParameter);
e.Handled = true;
}
}
}
public static bool GetItemsDoubleClick(ItemsControl element)
{
return (bool)element.GetValue(ItemsDoubleClickProperty);
}
}
그런 다음 연결된 속성과 대상 명령을 사용하여 ListBox를 선언합니다.
<ListBox ItemsSource="{Binding SomeItems}" myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>
이게 도움이 됐으면 좋겠다.
리스트 박스내의 어느쪽인가를 더블 클릭 했을 경우, 커맨드를 실행하는 문제를 해결하기 위해서, AndrewS 솔루션을 갱신했습니다.
public class ControlDoubleClick : DependencyObject
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(ControlDoubleClick), new PropertyMetadata(OnChangedCommand));
public static ICommand GetCommand(Control target)
{
return (ICommand)target.GetValue(CommandProperty);
}
public static void SetCommand(Control target, ICommand value)
{
target.SetValue(CommandProperty, value);
}
private static void OnChangedCommand(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Control control = d as Control;
control.PreviewMouseDoubleClick += new MouseButtonEventHandler(Element_PreviewMouseDoubleClick);
}
private static void Element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
Control control = sender as Control;
ICommand command = GetCommand(control);
if (command.CanExecute(null))
{
command.Execute(null);
e.Handled = true;
}
}
}
또한 XAML에서 ListBox 선언은 다음과 같습니다.
<ListBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}">
<ListBox.ItemContainerStyle>
<Style>
<Setter Property="behaviours:ControlDoubleClick.Command" Value="{Binding DataContext.MyCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type UserControl}}}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Expression SDK 4.0을 사용
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick" SourceName="CaravanasListBox">
<i:InvokeCommandAction Command="{Binding AccionesToolbarCommand}" CommandParameter="{x:Static local:OpcionesBarra.MostrarDetalle}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Jaimir G.
여기 둘 다에게 그렇게 하는 행동이 있다.ListBox
그리고.ListView
Andrew S.와 Vadim Topan의 답변에 근거하고 있습니다.수고하셨습니다 여러분!
public class ItemDoubleClickBehavior : Behavior<ListBox>
{
#region Properties
MouseButtonEventHandler Handler;
#endregion
#region Methods
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.PreviewMouseDoubleClick += Handler = (s, e) =>
{
e.Handled = true;
if (!(e.OriginalSource is DependencyObject source)) return;
ListBoxItem sourceItem = source is ListBoxItem ? (ListBoxItem)source :
source.FindParent<ListBoxItem>();
if (sourceItem == null) return;
foreach (var binding in AssociatedObject.InputBindings.OfType<MouseBinding>())
{
if (binding.MouseAction != MouseAction.LeftDoubleClick) continue;
ICommand command = binding.Command;
object parameter = binding.CommandParameter;
if (command.CanExecute(parameter))
command.Execute(parameter);
}
};
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.PreviewMouseDoubleClick -= Handler;
}
#endregion
}
다음은 부모를 찾는 데 사용되는 확장 클래스입니다.
public static class UIHelper
{
public static T FindParent<T>(this DependencyObject child, bool debug = false) where T : DependencyObject
{
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
if (parentObject is T parent)
return parent;
else
return FindParent<T>(parentObject);
}
}
사용방법:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:coreBehaviors="{{Your Behavior Namespace}}"
<ListView AllowDrop="True" ItemsSource="{Binding Data}">
<i:Interaction.Behaviors>
<coreBehaviors:ItemDoubleClickBehavior/>
</i:Interaction.Behaviors>
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding YourCommand}"/>
</ListBox.InputBindings>
</ListView>
언급URL : https://stackoverflow.com/questions/821564/double-click-a-listbox-item-to-open-a-browser
'source' 카테고리의 다른 글
git reset --mixed, --soft, 그리고 --hard의 차이점은 무엇입니까? (0) | 2023.04.16 |
---|---|
목록 또는 태플에서 항목을 명시적으로 선택 (0) | 2023.04.16 |
각 파일 및 디렉토리의 크기를 나열하고 Bash에서 내림차순으로 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
Swift에서 UIImageView 개체에 대한 작업을 할당하는 방법 (0) | 2023.04.11 |
Git은 BLOB에서의 SHA-1 충돌에 어떻게 대처합니까? (0) | 2023.04.11 |