wpf 데이터 그리드 및 추가 UI 요소가 있는 스크롤 뷰어에서 마우스 스크롤이 작동하지 않음
저는 스크롤 뷰어와 데이터 그리드가 있는 wpf 창에서 마우스 스크롤을 작동시키는 방법을 찾고 있습니다.WPF 및 C# 코드는 다음과 같습니다.
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Border Name="DataGridBorder" BorderThickness="2" Margin="1" CornerRadius="4" BorderBrush="#FF080757">
<dg:DataGrid AutoGenerateColumns="False" Name="ValuesDataGrid"
BorderThickness="0" CanUserResizeColumns="True" FontWeight="Bold" HorizontalScrollBarVisibility="Auto"
CanUserReorderColumns="False" IsReadOnly="True" IsTextSearchEnabled="True" AlternationCount="2"
SelectionMode="Extended" GridLinesVisibility="All"
HeadersVisibility="Column" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False"
RowDetailsVisibilityMode="Collapsed" SelectedIndex="0"
RowStyle="{StaticResource CognitiDataGridRowStyle}"
>
<dg:DataGrid.Columns>
<dg:DataGridTemplateColumn Header="Title" >
<dg:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding Path=Name}" FontWeight="Normal" />
</StackPanel>
</DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>
</dg:DataGridTemplateColumn>
</dg:DataGrid.Columns>
</dg:DataGrid>
</Border>
</Grid>
<Button Grid.Row="1" Height="90" >hello world</Button>
</Grid>
</ScrollViewer>
그리고 C# 코드는 다음과 같습니다.
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
initialize();
}
public void initialize()
{
ObservableCollection<MyObject> testList = new ObservableCollection<MyObject>();
for (int i = 0; i < 20; i++)
{
MyObject my = new MyObject("jack " + i);
testList.Add(my);
}
ValuesDataGrid.ItemsSource = testList;
}
}
public class MyObject
{
public string Name { get; set; }
public MyObject(string name)
{
Name = name;
}
}
제가 직면한 문제는 마우스를 사용하여 스크롤할 때 버튼 위에 있으면 작동이 잘 되지만 마우스 포인터를 그리드 위로 이동하고 스크롤하려고 하면 아무 일도 일어나지 않습니다.스크롤 뷰어의 스크롤 막대를 직접 이동할 수 있습니다.저는 아직 초보자이기 때문에 데이터 그리드에서 마우스 스크롤을 작동시키는 방법에 대한 도움을 주시면 감사하겠습니다.나는 이것에 대한 꽤 쉬운 해결책이 있을 것이라고 생각하지만 나는 그것을 알아낼 수 없었습니다.
저는 데이브의 해결책이 좋다고 생각합니다.하지만 한 가지 추천할 것은 미리 보기를 보는 것입니다.마우스 휠 이벤트가 데이터 그리드가 아닌 스크롤 뷰어에서 발생합니다.그렇지 않은 경우 데이터 그리드를 스크롤하는지 아니면 스크롤 막대 자체를 스크롤하는지에 따라 약간의 차이가 있을 수 있습니다.그 이유는 마우스가 스크롤 막대 위에 있을 때 스크롤 뷰어가 스크롤을 처리하고 데이터 그리드 이벤트가 데이터 그리드 위에 있을 때 스크롤을 처리하기 때문입니다.예를 들어, 데이터 그리드 위에 마우스 휠 스크롤을 한 번 하면 스크롤 막대 위에 있을 때보다 목록 아래로 더 내려갈 수 있습니다.스크롤 뷰어 미리 보기 이벤트에서 캡처하면 스크롤할 때 모두 동일한 측정값을 사용합니다.또한 스크롤 뷰어에 전달된 보낸 사람 개체를 입력하기만 하면 되므로 스크롤 뷰어 요소의 이름을 지정할 필요가 없습니다. 미리 보기마우스 휠 이벤트.마지막으로, 어떤 이유로 인해 하위 계층의 요소에서 이벤트를 포착해야 하는 경우가 아니라면 이벤트가 끝날 때 처리된 이벤트를 표시하는 것이 좋습니다.아래의 예:
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scv = (ScrollViewer)sender;
scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
e.Handled = true;
}
데이터 그리드에서 스크롤할 필요가 없다고 가정합니다. 데이터 그리드에서 수직 스크롤 막대="없음"을 설정합니다.
데이터 그리드가 마우스 스크롤 이벤트를 삼킵니다.
미리 보기를 사용하는 것을 발견했습니다.MouseWheel 이벤트 - 스크롤할 컨테이너를 스크롤합니다.수직 오프셋을 변경하려면 스크롤 뷰어의 이름을 지정해야 합니다.
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset-e.Delta);
}
Don B의 솔루션에 대한 개선 사항은 사용하지 않는 것입니다.ScrollToVerticalOffset
.
scv.ScrollToVerticalOffset(scv.VerticalOffset - e.Delta);
VerticalOffset - Delta
결과적으로 상당히 불쾌한 경험을 하게 됩니다.Scroll Viewer는 이보다 더 부드러운 움직임을 만들기 위해 많은 생각을 합니다.dpi와 다른 요소들을 바탕으로 델타를 축소하는 것도 가능할 것 같습니다...
나는 그것을 잡고 처리하는 것이 더 낫다는 것을 발견했습니다.PreviewMouseWheelEvent
그리고 a를 보냅니다.MouseWheelEvent
한 대로ScrollViewer
제가 만든 Don B의 솔루션은 다음과 같습니다.
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta);
eventArg.RoutedEvent = UIElement.MouseWheelEvent;
eventArg.Source = e.Source;
ScrollViewer scv = (ScrollViewer)sender;
scv.RaiseEvent(eventArg);
e.Handled = true;
}
하려면 터치지활려설정수있다습니도할면하성원을화다▁want▁to니를 설정할 .ScrollViewer.PanningMode
None
의 신의에DataGrid
을 동한속성다설음정합니다로으을일다설로 합니다.VerticalFirst
당신의 값.ScrollViewer
예
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="5" PanningMode="VerticalFirst">
<DataGrid ScrollViewer.PanningMode="None" ItemsSource="{Binding Items}" />
</ScrollViewer>
물론, 또사합다니용한▁the도 하세요.PreviewMouseWheel
이벤트는 원래 마우스 스크롤 문제를 해결하기 위해 Don B의 답변에 표시됩니다.
private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
var scrollViewer = (ScrollViewer)sender;
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
e.Handled = true;
}
또는음속다연결설수정있습다니할성을로 할 수 .ScrollViewer
public class TopMouseScrollPriorityBehavior
{
public static bool GetTopMouseScrollPriority(ScrollViewer obj)
{
return (bool)obj.GetValue(TopMouseScrollPriorityProperty);
}
public static void SetTopMouseScrollPriority(ScrollViewer obj, bool value)
{
obj.SetValue(TopMouseScrollPriorityProperty, value);
}
public static readonly DependencyProperty TopMouseScrollPriorityProperty =
DependencyProperty.RegisterAttached("TopMouseScrollPriority", typeof(bool), typeof(TopMouseScrollPriorityBehavior), new PropertyMetadata(false, OnPropertyChanged));
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var scrollViewer = d as ScrollViewer;
if (scrollViewer == null)
throw new InvalidOperationException($"{nameof(TopMouseScrollPriorityBehavior)}.{nameof(TopMouseScrollPriorityProperty)} can only be applied to controls of type {nameof(ScrollViewer)}");
if (e.NewValue == e.OldValue)
return;
if ((bool)e.NewValue)
scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel;
else
scrollViewer.PreviewMouseWheel -= ScrollViewer_PreviewMouseWheel;
}
private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
var scrollViewer = (ScrollViewer)sender;
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
e.Handled = true;
}
}
사용.
<ScrollViewer b:TopMouseScrollPriorityBehavior.TopMouseScrollPriority="True" VerticalScrollBarVisibility="Auto" Margin="5" PanningMode="VerticalFirst">
<DataGrid ScrollViewer.PanningMode="None" ItemsSource="{Binding Items}" />
</ScrollViewer>
여기서 b:는 이 동작을 포함하는 네임스페이스입니다.
이렇게 하면 코드백이 필요하지 않고 앱이 전적으로 MVVM입니다.
Don B의 솔루션을 사용해봤는데 데이터 그리드를 스크롤하는 문제가 다른 내부 스크롤 가능한 컨트롤이 없는 경우에 잘 해결됩니다.
스크롤 뷰어에 다른 스크롤 가능한 컨트롤과 데이터 그리드가 있는 경우, 메인 스크롤 뷰어에 대한 이벤트 핸들러 끝에서 이벤트가 처리된 것으로 표시되지 않아야 내부 스크롤 가능한 컨트롤에서도 캡처할 수 있습니다.그러나 스크롤이 내부 스크롤 가능 컨트롤에서만 발생해야 하는 경우 기본 스크롤 뷰어에서도 발생한다는 부작용이 있습니다.
스크롤 뷰어의 이름을 알 필요가 없도록 스크롤 뷰어를 찾는 방법에 대한 차이로 Dave의 솔루션을 업데이트했습니다.
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
ScrollViewer scrollViewer = (((DependencyObject)sender).GetVisualParent<ScrollViewer>());
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
}
@fjch1997, 저는 당신의 솔루션을 사용했고 그것은 꽤 잘 작동합니다.제가 발견한 문제는 단 한 가지입니다.@Vadim Tofan의 댓글과 연결되어 있습니다.
스크롤 뷰어에 다른 스크롤 가능한 컨트롤과 데이터 그리드가 있는 경우, 메인 스크롤 뷰어에 대한 이벤트 핸들러 끝에서 이벤트가 처리된 것으로 표시되지 않아야 내부 스크롤 가능한 컨트롤에서도 캡처할 수 있습니다.그러나 스크롤이 내부 스크롤 가능 컨트롤에서만 발생해야 하는 경우 기본 스크롤 뷰어에서도 발생한다는 부작용이 있습니다.
저는 또한 제거하려고 노력했습니다.e.Handled = true
문, 그러나 효과가 좋지 않습니다. 두 스크롤이 동시에 이동합니다.마지막으로 이벤트 핸들러 방법을 다음과 같이 약간 개선했습니다.
private static void ScrollViewer_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e)
{
ScrollViewer scrollViewer = (ScrollViewer)sender;
FrameworkElement origicalControlSender = e.OriginalSource as FrameworkElement;
ScrollViewer closestScrollViewer = origicalControlSender.GetParent<ScrollViewer>();
if (closestScrollViewer != null && !ReferenceEquals(closestScrollViewer, scrollViewer))
{
return;
}
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
e.Handled = true;
}
public static T GetParent<T>(this FrameworkElement control)
where T : DependencyObject
{
FrameworkElement parentElement = control?.Parent as FrameworkElement;
if (parentElement == null)
{
return null;
}
T parent = parentElement as T;
if (parent != null)
{
return parent;
}
return GetParent<T>(parentElement);
}
이렇게 하면 내부 ScrollViewer가 존재하는 경우 외부 스크롤러가 스크롤되지 않습니다.
여러분, 제가 여기에 올린 대부분의 솔루션과 근본적으로 모든 솔루션이 옳지만, 우리가 적용할 수 있는 가장 쉽고 우아한 구문이 있다고 생각합니다.
데이터 그리드를 사용하여 스크롤할 필요가 없고 대신 메인 창을 사용하여 스크롤하려고 합니다.
"데이브"와 "블라딤 토판"의 대답에 따르는 것.
Private Void Scrlll(Object sebder, MouseWheelEventArgs e)
{
var windows = (Window.GetWindow(this) as MainWindow).MainScroll;
windows.ScrollToVerticalOffset(windows.VerticalOffset - e.Delta);
}
영어가 서툴러서 죄송합니다.
다음은 데이터 그리드를 스크롤하는 WPF 동작을 생성하는 더 큰 예입니다.
먼저 프레임워크 요소와 동작 클래스 및 동작 구현을 결합하기 위한 다음 기본 클래스를 정의합니다.
using System.Diagnostics.CodeAnalysis;
using System.Windows;
using System.Windows.Input;
namespace SomeAcme.Client.Infrastructure
{
/// <summary>
/// Behavior handler class for creating WPF behaviors.
/// </summary>
[ExcludeFromCodeCoverage]
public class BehaviorHandler<TAssociatedObject, TBehaviorClass>
where TAssociatedObject: DependencyObject
where TBehaviorClass : class, IAssociationBehavior, new()
{
public BehaviorHandler()
{
}
public static TBehaviorClass GetBehavior(DependencyObject obj)
{
if (obj == null)
return null;
return (TBehaviorClass)obj.GetValue(BehaviorProperty);
}
public static void SetBehavior(DependencyObject obj, TBehaviorClass value)
{
if (obj != null)
{
obj.SetValue(BehaviorProperty, value);
}
}
// Using a DependencyProperty as the backing store for Behavior. This enables animation, styling, binding, etc...
public static readonly DependencyProperty BehaviorProperty =
DependencyProperty.RegisterAttached("Behavior", typeof(TBehaviorClass), typeof(object), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));
public void FindOrCreateBehaviorOnDemand(DependencyObject dependencyObject)
{
//Apply the behavior
TBehaviorClass behavior = FindOrCreateBehavior(dependencyObject);
if (behavior != null)
{
dependencyObject.SetValue(BehaviorProperty, behavior);
}
}
public TBehaviorClass FindOrCreateBehavior(DependencyObject dependencyObject)
{
if (dependencyObject == null)
return null;
var associatedObject = dependencyObject;
if (associatedObject == null)
return null;
var behavior = dependencyObject.GetValue(BehaviorProperty) as TBehaviorClass;
if (behavior == null)
{
var behaviorAssociated = new TBehaviorClass();
if (behaviorAssociated == null)
return null;
behaviorAssociated.InitializeAssociation(associatedObject, AssociatedCommands);
return behaviorAssociated;
}
else
{
return behavior;
}
} //TBehaviorClass FindOrCreateBehavior
/// <summary>
/// Set the associated commands to pass into the WPF behavior, if desired
/// </summary>
public ICommand[] AssociatedCommands { get; set; }
}
}
이것은 조금 더 복잡해 보이지만 행동 클래스를 프레임워크 요소와 결합할 때 보일러 플레이트 코딩을 단순화합니다.이 경우에는 관련 명령을 사용할 필요가 없습니다.
스크롤 뷰어 동작은 다음과 같습니다.
using SomeAcme.Client.Infrastructure;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
namespace SomeAcme.Client.Infrastructure
{
public static class ScrollViewerMouseWheelScrollBehavior
{
public static string GetUseMouseScrollForScrollViewer(DependencyObject obj)
{
if (obj != null)
{
return (string)obj.GetValue(UseMouseScrollForScrollViewerProperty);
}
else
return null;
}
public static void SetUseMouseScrollForScrollViewer(DependencyObject obj, string value)
{
if (obj != null)
{
obj.SetValue(UseMouseScrollForScrollViewerProperty, value);
}
}
public static readonly DependencyProperty UseMouseScrollForScrollViewerCommandProperty =
DependencyProperty.RegisterAttached("UseScrollForScrollViewer", typeof(string), typeof(ScrollViewerMouseWheelScrollBehavior),
new PropertyMetadata(new PropertyChangedCallback(OnUseScrollForScrollViewerSet)));
public static void OnUseScrollForScrollViewerSet(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
bool useScroll;
bool.TryParse(eventArgs.NewValue?.ToString(), out useScroll);
if (useScroll)
{
var behaviorHandler =
new BehaviorHandler<ScrollViewer, ScrollViewerMouseScrollBehaviorImplementation>();
//behaviorHandler.AssociatedCommands =
// new Microsoft.Practices.Prism.Commands.DelegateCommand<object>[] { (Microsoft.Practices.Prism.Commands.DelegateCommand<object>)eventArgs.NewValue };
behaviorHandler.FindOrCreateBehaviorOnDemand(dependencyObject);
}
}
}
}
namespace SomeAcme.Client.Infrastructure
{
public class ScrollViewerMouseScrollBehaviorImplementation : IAssociationBehavior
{
public void InitializeAssociation(DependencyObject associatedObject, params ICommand[] commands)
{
//TODO: Add commands to associate
var scrollViewer = associatedObject as ScrollViewer;
if (scrollViewer != null)
{
scrollViewer.PreviewMouseWheel += ScrollViewer_PreviewMouseWheel;
}
}
private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
var scrollViewer = sender as ScrollViewer;
if (scrollViewer != null)
{
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - e.Delta);
}
}
}
}
그런 다음 XAML에서 먼저 네임스페이스를 정의할 수 있습니다.
xmlns:local="clr-namespace:SomeAcme.Client.Infrastructure"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
마지막으로 XAML에서 WPF 동작을 사용하여 마우스 휠 스크롤을 사용할 준비가 되었습니다.
..
<TabControl Grid.Row="1">
<TabItem Header="Skjemafelter">
<ScrollViewer Height="700" local:ScrollViewerMouseWheelScrollBehavior.UseMouseScrollForScrollViewer="{x:Static sys:Boolean.TrueString}">
<ListView x:Name="ColumnsListView" ItemsSource="{Binding CurrentFields}">
<ListView.View>
<GridView>
저는 이 접근 방식이 작동하는지 테스트하고 검증했습니다.WPF 앱으로 작업하는 개발자의 경우, WPF 동작을 활용하면 코드 뒤에 있는 코드의 양을 최소 비트까지 그대로 유지하고 MVVM 접근 방식을 충실히 유지할 수 있습니다.
그리드에 ScrollPanel이 내장되어 있어서 ScrollPanel로 감싸면 전혀 작동하지 않았습니다. 고정 높이의 그리드를 만드는 것은 다른 응용 프로그램과 함께 적절하게 크기를 조정하기 위해 불가능했습니다.
제가 한 것은 여기에 있는 몇 가지 더 높은 등급의 솔루션을 조합한 것이었지만, 기본적으로 아이디어는 스크롤 패널을 제거하고 미리 보기를 파이프로 연결하는 것입니다.데이터 그리드의 마우스 이벤트가 실제로 스크롤을 처리하는 상위 컨트롤로 돌아갑니다(내 경우에는 그리드였습니다).
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
MouseWheelEventArgs eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
{
RoutedEvent = MouseWheelEvent, Source = e.Source
};
DependencyObject parent = VisualTreeHelper.GetParent((DependencyObject) sender);
while (parent != null && !(parent is Grid))
{
parent = VisualTreeHelper.GetParent(parent);
}
if (parent != null)
{
Grid grid = (Grid) parent;
grid.RaiseEvent(eventArg);
}
e.Handled = true;
}
저는 이것을 찾았습니다: http://wpfthoughts.blogspot.com/2014/05/datagrid-vertical-scrolling-issues.html 그리고 여기에 추가해야겠다고 생각했습니다."Framework 4.5를 대상으로 하는 경우, DataGrid의 내부 가상화 패널에 항목(기본값) 또는 픽셀로 설정할 수 있는 ScrollUnit이라는 새로운 종속성 개체가 있습니다.XAML을 조금만 수정하면 어떻게 작동하는지 알 수 있습니다."
<DataGrid Name="DG" ItemsSource="{Binding B0}" AutoGenerateColumns="False" IsReadOnly="true" RowDetailsVisibilityMode="Visible" Width="200"
Height="100" VirtualizingPanel.ScrollUnit="Pixel">
시간이 많이 흘렀지만 동일한 문제를 만나 DockPanel로 해결했습니다.
<DockPanel Grid.ColumnSpan="3" LastChildFill="True">
<Button DockPanel.Dock="Top" Content="Add" Grid.Column="3" HorizontalAlignment="Right" Width="110" Height="30" Margin="5"/>
<DataGrid x:Name="xxDG" SelectionUnit="Cell" ItemsSource="{Binding}" Margin="0, 0, 0, 0" >
...
</DataGrid>
</DockPanel>
어떤 이유에서인지 마우스 휠 이벤트를 매력적으로 처리합니다.
ScrollViewer를 연결할 수 없습니다. 즉, ScrollViewer 태그 아래에서 그리드가 시작되고 그리드에 DataGrid가 있고 DataGrid에서 ScrollViewer 속성이 다시 설정된 경우와 같이 연결됩니다.
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="45" />
<RowDefinition Height="100*" />
<RowDefinition Height="105" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Grid.Row="0"
Grid.Column="0"
Margin="10,0,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Vessel: " />
<TextBox Height="30"
Width="300"
Margin="70,0,0,0"
HorizontalAlignment="Left"
BorderThickness="1,1,1,1"
IsReadOnly="True"
Name="txtVessel" />
<Label Grid.Row="0"
Grid.Column="2"
Margin="0,0,185,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Month:" />
<StackPanel Orientation="Horizontal"
Grid.Row="0"
Grid.Column="2"
Margin="0,0,0,0"
HorizontalAlignment="Right">
<ComboBox BorderThickness="2"
HorizontalAlignment="Right"
Name="CmbMonth"
VerticalAlignment="Center"
Width="90" />
<ComboBox BorderThickness="2"
HorizontalAlignment="Right"
Margin="5,0,0,0"
Name="CmbYear"
VerticalAlignment="Center"
Width="90" />
</StackPanel>
<Grid Grid.Row="1"
Grid.ColumnSpan="2">
<Grid.RowDefinitions>
<RowDefinition Height="45" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30" />
<ColumnDefinition Width="220" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="120" />
<ColumnDefinition Width="120" />
<ColumnDefinition Width="140*" />
</Grid.ColumnDefinitions>
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="0" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="1" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="2" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="3" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="4" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="5" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="6" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="7" />
<Border BorderBrush="Black"
BorderThickness="0,1,1,1"
Grid.Row="0"
Grid.Column="8" />
<Label Grid.Row="0"
Grid.Column="1"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Item" />
<Label Grid.Row="0"
Grid.Column="2"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Maker" />
<Label Grid.Row="0"
Grid.Column="3"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Model" />
<Label Grid.Row="0"
Grid.Column="4"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content=" Part No.
Serial No." />
<Label Grid.Row="0"
Grid.Column="5"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Condition" />
<Label Grid.Row="0"
Grid.Column="6"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content=" Onboard
 Calibr/Test" />
<Label Grid.Row="0"
Grid.Column="7"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content=" Shore
 Callibration" />
<Label Grid.Row="0"
Grid.Column="8"
Margin="0,0,0,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Remarks" />
</Grid>
<Border Grid.Row="2"
Grid.ColumnSpan="2">
<ScrollViewer Grid.Row="2"
Grid.ColumnSpan="2"
CanContentScroll="True"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"
Name="ScrollViewer3"
Margin="0,0,0,0">
<Grid Name="grdOnBoardCalibrationRecord"
Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"></ColumnDefinition>
<ColumnDefinition Width="220"></ColumnDefinition>
<ColumnDefinition Width="80"></ColumnDefinition>
<ColumnDefinition Width="80"></ColumnDefinition>
<ColumnDefinition Width="80"></ColumnDefinition>
<ColumnDefinition Width="80"></ColumnDefinition>
<ColumnDefinition Width="120"></ColumnDefinition>
<ColumnDefinition Width="120"></ColumnDefinition>
<ColumnDefinition Width="140*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Column="0"
BorderThickness="1,0,1,1"
BorderBrush="Black"
Grid.RowSpan="26"></Border>
<Border Grid.Column="1"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="2"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="3"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="4"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="5"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="6"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="7"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
<Border Grid.Column="8"
BorderThickness="0,1,1,1"
Grid.RowSpan="26"></Border>
</Grid>
</ScrollViewer>
</Border>
<Grid Grid.Row="3"
Grid.ColumnSpan="2">
<Grid.RowDefinitions>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="40"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0"
Grid.Column="0"
Height="30"
Width="300"
TextAlignment="Center"
Background="Gray"
IsReadOnly="True"
Margin="0,0,0,0"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
BorderThickness="1,1,1,1"
Name="txtChiefEngineer" />
<Label Grid.Row="1"
Grid.Column="1"
Margin="0,0,100,0"
HorizontalAlignment="Right"
VerticalAlignment="Center"
FontWeight="Bold"
Content="Chief Engineer" />
<StackPanel Orientation="Horizontal"
Grid.Row="2"
Margin="0,0,0,0">
<Label Name="lblonshorecomment"
Content=" Shore Comment : "
HorizontalAlignment="Center"
Margin="5,0,0,0"
FontWeight="Bold"
VerticalAlignment="Center"
FontFamily="Calibri"
FontStyle="Normal"
FontSize="14"></Label>
<TextBox BorderThickness="1"
FontWeight="Normal"
IsReadOnly="True"
Height="44"
Width="878"
TextWrapping="Wrap"
AcceptsReturn="True"
HorizontalAlignment="left"
Margin="0,0,0,0"
Name="txtShoreComment"
VerticalAlignment="Center" />
</StackPanel>
</Grid>
</Grid>
언급URL : https://stackoverflow.com/questions/2922303/mouse-scroll-not-working-in-a-scroll-viewer-with-a-wpf-datagrid-and-additional-u
'it-source' 카테고리의 다른 글
다중 IP 주소로 mongod.conf bind_ip을 설정하는 방법 (0) | 2023.05.21 |
---|---|
CSS(jQuery SVG image replacement)를 사용하여 SVG 이미지의 색상을 변경하는 방법은 무엇입니까? (0) | 2023.05.21 |
값이 null이 아닌 데이터 트리거? (0) | 2023.05.21 |
현재 메서드 호출의 스레드 ID를 가져오는 중 (0) | 2023.05.21 |
jQuery를 사용하여 요소의 제목 속성을 변경하는 방법 (0) | 2023.05.16 |