2016-04-27 22 views
2

私は、ScrollViewerにある複数のコントロールを実装する動的StackPanelで作業していました。私が直面している問題は、私のマウスがDataGridに当たったときに私がStackPanel全体をスクロールできないことです。私はそれがDataGridにスクロールオプションそのものがあるからだと分かりました。私はそれを無効にする方法を知りたい。私はコントロールをプログラムで作成して変更する方が好きです。ソリューションでは、私はDataGridを変更することができなければならず、DataGridはユーザーがスクロールダウンしたり停止してはいけません。StackPanelは、Datagrid WPF上でのスクロールを停止します

<Window x:Class="testscroll.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:testscroll" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 

    <ScrollViewer HorizontalAlignment="Left" Height="300" Margin="10,10,0,0"VerticalAlignment="Top" Width="497"> 

     <StackPanel x:Name="panel" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" /> 
    </ScrollViewer> 

</Grid> 

これは私のテストコード

using System.Data; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 


namespace testscroll 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      panel.Children.Clear(); 


      Label lblTicket = new Label(); 
      lblTicket.Content = "RT Ticket"; 
      panel.Children.Add(lblTicket); 
      TextBox txtBoxRTTicket = new TextBox(); 

      txtBoxRTTicket.Text = "test"; 
      txtBoxRTTicket.MaxLength = 5; 
      txtBoxRTTicket.Margin = new Thickness(60, -25, 0, 0); 
      panel.Children.Add(txtBoxRTTicket); 

      TextBox txtBoxRTTicketFull = new TextBox(); 
      txtBoxRTTicketFull.Foreground = Brushes.Blue; 
      txtBoxRTTicketFull.TextDecorations = TextDecorations.Underline; 
      txtBoxRTTicketFull.Name = "txtBoxRTTicketFull"; 
      txtBoxRTTicketFull.Text = "http://mtl-ppapp-rt01/rt/Ticket/Display.html?id=" + "11111"; 
      //txtBoxRTTicket.TextChanged += TxtBoxRTTicket_TextChanged; 
      //txtBoxRTTicketFull.MouseDoubleClick += TextBox_MouseDoubleClick; 
      txtBoxRTTicketFull.IsReadOnly = true; 
      txtBoxRTTicketFull.Margin = new Thickness(200, -25, 0, 0); 
      panel.Children.Add(txtBoxRTTicketFull); 

      Label space1 = new Label(); 
      space1.Content = ""; 
      panel.Children.Add(space1); 
      Label lblTrackPage = new Label(); 
      lblTrackPage.Content = "Trac Page"; 
      panel.Children.Add(lblTrackPage); 
      TextBox txtBoxTrackPage = new TextBox(); 
      txtBoxTrackPage.Text = "test"; 
      txtBoxTrackPage.Foreground = Brushes.Blue; 
      txtBoxTrackPage.TextDecorations = TextDecorations.Underline; 
      //txtBoxTrackPage.MouseDoubleClick += TextBox_MouseDoubleClick; 
      txtBoxTrackPage.Margin = new Thickness(60, -25, 0, 0); 
      panel.Children.Add(txtBoxTrackPage); 
      //un espace dans le stackpanel 
      Label space2 = new Label(); 
      space2.Content = ""; 
      panel.Children.Add(space2); 
      //on ajoute le premier tableau concernant le pcb 
      DataTable tablePCB = new DataTable(); 
      tablePCB.Columns.Add("PCB Number"); 
      tablePCB.Columns.Add("CAD Number"); 
      tablePCB.Columns.Add("Baan Descriptiion"); 
      tablePCB.Columns.Add("Display Description"); 
      tablePCB.Columns.Add("Detail Description"); 
      tablePCB.Rows.Add(); 
      tablePCB.Rows[0][0] = "000-00000-00"; 
      string cadNbr = ((string)tablePCB.Rows[0][0]).Substring(3, 6); 
      tablePCB.Rows[0][1] = "cad" + cadNbr; 
      tablePCB.Rows[0][2] = "test"; 
      tablePCB.Rows[0][3] = "test"; 
      tablePCB.Rows[0][4] = "test"; 
      tablePCB.Columns[0].ReadOnly = true; 
      tablePCB.Columns[1].ReadOnly = true; 
      tablePCB.Columns[2].ReadOnly = true; 
      tablePCB.Columns[3].ReadOnly = true; 
      DataGrid dgvPCB = new DataGrid(); 

      dgvPCB.CanUserAddRows = false; 
      dgvPCB.ItemsSource = tablePCB.DefaultView; 
      panel.Children.Add(dgvPCB); 
      //un espace dans le stackpanel 
      Label space3 = new Label(); 
      space3.Content = ""; 
      panel.Children.Add(space3); 
      //on ajoute le premier tableau concernant les assembly 
      DataTable tableAssy = new DataTable(); 
      tableAssy.Columns.Add("Assembly Number"); 
      tableAssy.Columns.Add("Schematic Description"); 
      tableAssy.Columns.Add("Work Instruction"); 
      tableAssy.Columns.Add("Warehouse"); 
      tableAssy.Columns.Add("Baan Description");//isreadonly 
      tableAssy.Columns.Add("Display Description"); 
      tableAssy.Columns.Add("Detail Description"); 
      for (int i = 0; i < 1; i++) 
      { 
       tableAssy.Rows.Add(); 
       tableAssy.Rows[i][0] = "test"; 
       tableAssy.Rows[i][1] = "test"; 
       tableAssy.Rows[i][2] = "test"; 
       tableAssy.Rows[i][3] = "test"; 
       tableAssy.Rows[i][4] = "test"; 
       tableAssy.Rows[i][5] = "test"; 
       tableAssy.Rows[i][6] = "test"; 
      } 
      tableAssy.Columns[3].ReadOnly = true; 
      tableAssy.Columns[4].ReadOnly = true; 
      DataGrid dgvAssy = new DataGrid(); 
      //dgvAssy.CanUserAddRows = false; 
      dgvAssy.ItemsSource = tableAssy.DefaultView; 

      panel.Children.Add(dgvAssy); 

      if (null != panel.FindName(txtBoxRTTicketFull.Name)) 
       panel.UnregisterName(txtBoxRTTicketFull.Name); 
      panel.RegisterName(txtBoxRTTicketFull.Name, txtBoxRTTicketFull); 

      Label lblNote = new Label(); 
      lblNote.Content = "Notes:"; 

      TextBox txtBoxNotes = new TextBox(); 
      txtBoxNotes.Text = "test"; 
      txtBoxNotes.AcceptsReturn = true; 
      txtBoxNotes.Height = 300; 
      txtBoxNotes.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
      txtBoxNotes.MaxHeight = 300; 
      txtBoxNotes.TextWrapping = TextWrapping.Wrap; 
      txtBoxNotes.MaxWidth = 800; 
      txtBoxNotes.ScrollToEnd(); 
      Button btnAddAssembly = new Button(); 
      btnAddAssembly.Content = "Save changes"; 
      //btnAddAssembly.Click += ((sender1, e1) => save_click(sender1, e1, txtBoxRTTicket.Text, txtBoxTrackPage.Text, (string)tablePCB.Rows[0][3], (string)tablePCB.Rows[0][4], tableAssy, txtBoxNotes, log)); 
      panel.Children.Add(btnAddAssembly); 

      panel.Children.Add(lblNote); 

      panel.Children.Add(txtBoxNotes); 
     } 

    } 
} 

EDITです: enter image description here

+1

あなたWPFのレッスン1をスキップしておく必要があります。 XAMLを使用してビューを作成する –

+0

XAMLを使用しない理由コンパイル時に生成している場合、XAMLは書きやすく、見やすくなります。 –

+0

StackPanelはユーザーが値を入力するか、または選択を変更するときに変更されるため、パネルの一部が削除され、XAMLでコード化できないものが追加されます。 –

答えて

1

EDIT:RESUMED:それには、データグリッドと流体であるScrollViewerのを作るために、あなたをこの機能を追加する必要があります。

DataGrid dgvAssy = new DataGrid(); 

dgv.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; 

dgv.PreviewMouseWheel += DgvAssy_PreviewMouseWheel; 


private void DgvAssy_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) 
{ 
    scrollviewer1.ScrollToVerticalOffset(scrollviewer1.VerticalOffset - e.Delta); 
} 

EDIT:解決策が見つかりました。下のコードを確認してください!問題は、データグリッドがスクロールビューアをスクロールしないことです。マウスのスクロールイベントを取得し、スクロールビューアをスクロールします。

XAML:背後

<Window x:Class="testscroll.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:testscroll" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ScrollViewer x:Name="scrollviewer1" HorizontalAlignment="Left" Height="300" Margin="10,10,0,0" VerticalAlignment="Top" Width="497"> 
      <StackPanel x:Name="panel" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" /> 
     </ScrollViewer> 
    </Grid> 
</Window> 

コード:

using System.Data; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Media; 


namespace testscroll 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      panel.Children.Clear(); 


      Label lblTicket = new Label(); 
      lblTicket.Content = "RT Ticket"; 
      panel.Children.Add(lblTicket); 
      TextBox txtBoxRTTicket = new TextBox(); 

      txtBoxRTTicket.Text = "test"; 
      txtBoxRTTicket.MaxLength = 5; 
      txtBoxRTTicket.Margin = new Thickness(60, -25, 0, 0); 
      panel.Children.Add(txtBoxRTTicket); 

      TextBox txtBoxRTTicketFull = new TextBox(); 
      txtBoxRTTicketFull.Foreground = Brushes.Blue; 
      txtBoxRTTicketFull.TextDecorations = TextDecorations.Underline; 
      txtBoxRTTicketFull.Name = "txtBoxRTTicketFull"; 
      txtBoxRTTicketFull.Text = "http://mtl-ppapp-rt01/rt/Ticket/Display.html?id=" + "11111"; 
      //txtBoxRTTicket.TextChanged += TxtBoxRTTicket_TextChanged; 
      //txtBoxRTTicketFull.MouseDoubleClick += TextBox_MouseDoubleClick; 
      txtBoxRTTicketFull.IsReadOnly = true; 
      txtBoxRTTicketFull.Margin = new Thickness(200, -25, 0, 0); 
      panel.Children.Add(txtBoxRTTicketFull); 

      Label space1 = new Label(); 
      space1.Content = ""; 
      panel.Children.Add(space1); 
      Label lblTrackPage = new Label(); 
      lblTrackPage.Content = "Trac Page"; 
      panel.Children.Add(lblTrackPage); 
      TextBox txtBoxTrackPage = new TextBox(); 
      txtBoxTrackPage.Text = "test"; 
      txtBoxTrackPage.Foreground = Brushes.Blue; 
      txtBoxTrackPage.TextDecorations = TextDecorations.Underline; 
      //txtBoxTrackPage.MouseDoubleClick += TextBox_MouseDoubleClick; 
      txtBoxTrackPage.Margin = new Thickness(60, -25, 0, 0); 
      panel.Children.Add(txtBoxTrackPage); 
      //un espace dans le stackpanel 
      Label space2 = new Label(); 
      space2.Content = ""; 
      panel.Children.Add(space2); 
      //on ajoute le premier tableau concernant le pcb 
      DataTable tablePCB = new DataTable(); 
      tablePCB.Columns.Add("PCB Number"); 
      tablePCB.Columns.Add("CAD Number"); 
      tablePCB.Columns.Add("Baan Descriptiion"); 
      tablePCB.Columns.Add("Display Description"); 
      tablePCB.Columns.Add("Detail Description"); 
      tablePCB.Rows.Add(); 
      tablePCB.Rows[0][0] = "000-00000-00"; 
      string cadNbr = ((string)tablePCB.Rows[0][0]).Substring(3, 6); 
      tablePCB.Rows[0][1] = "cad" + cadNbr; 
      tablePCB.Rows[0][2] = "test"; 
      tablePCB.Rows[0][3] = "test"; 
      tablePCB.Rows[0][4] = "test"; 
      tablePCB.Columns[0].ReadOnly = true; 
      tablePCB.Columns[1].ReadOnly = true; 
      tablePCB.Columns[2].ReadOnly = true; 
      tablePCB.Columns[3].ReadOnly = true; 
      DataGrid dgvPCB = new DataGrid(); 

      dgvPCB.CanUserAddRows = false; 
      dgvPCB.ItemsSource = tablePCB.DefaultView; 

      panel.Children.Add(dgvPCB); 
      //un espace dans le stackpanel 
      Label space3 = new Label(); 
      space3.Content = ""; 
      panel.Children.Add(space3); 
      //on ajoute le premier tableau concernant les assembly 
      DataTable tableAssy = new DataTable(); 
      tableAssy.Columns.Add("Assembly Number"); 
      tableAssy.Columns.Add("Schematic Description"); 
      tableAssy.Columns.Add("Work Instruction"); 
      tableAssy.Columns.Add("Warehouse"); 
      tableAssy.Columns.Add("Baan Description");//isreadonly 
      tableAssy.Columns.Add("Display Description"); 
      tableAssy.Columns.Add("Detail Description"); 
      for (int i = 0; i < 1; i++) 
      { 
       tableAssy.Rows.Add(); 
       tableAssy.Rows[i][0] = "test"; 
       tableAssy.Rows[i][1] = "test"; 
       tableAssy.Rows[i][2] = "test"; 
       tableAssy.Rows[i][3] = "test"; 
       tableAssy.Rows[i][4] = "test"; 
       tableAssy.Rows[i][5] = "test"; 
       tableAssy.Rows[i][6] = "test"; 
      } 
      tableAssy.Columns[3].ReadOnly = true; 
      tableAssy.Columns[4].ReadOnly = true; 
      DataGrid dgvAssy = new DataGrid(); 
      dgvPCB.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; 
      dgvAssy.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; 

      dgvAssy.PreviewMouseWheel += DgvAssy_PreviewMouseWheel; 
      dgvPCB.PreviewMouseWheel += DgvAssy_PreviewMouseWheel; 
      //dgvAssy.CanUserAddRows = false; 
      dgvAssy.ItemsSource = tableAssy.DefaultView; 

      panel.Children.Add(dgvAssy); 

      if (null != panel.FindName(txtBoxRTTicketFull.Name)) 
       panel.UnregisterName(txtBoxRTTicketFull.Name); 
      panel.RegisterName(txtBoxRTTicketFull.Name, txtBoxRTTicketFull); 

      Label lblNote = new Label(); 
      lblNote.Content = "Notes:"; 

      TextBox txtBoxNotes = new TextBox(); 
      txtBoxNotes.Text = "test"; 
      txtBoxNotes.AcceptsReturn = true; 
      txtBoxNotes.Height = 300; 
      txtBoxNotes.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
      txtBoxNotes.MaxHeight = 300; 
      txtBoxNotes.TextWrapping = TextWrapping.Wrap; 
      txtBoxNotes.MaxWidth = 800; 
      txtBoxNotes.ScrollToEnd(); 
      Button btnAddAssembly = new Button(); 
      btnAddAssembly.Content = "Save changes"; 
      //btnAddAssembly.Click += ((sender1, e1) => save_click(sender1, e1, txtBoxRTTicket.Text, txtBoxTrackPage.Text, (string)tablePCB.Rows[0][3], (string)tablePCB.Rows[0][4], tableAssy, txtBoxNotes, log)); 
      panel.Children.Add(btnAddAssembly); 

      panel.Children.Add(lblNote); 

      panel.Children.Add(txtBoxNotes); 

     } 

     private void DgvAssy_PreviewMouseWheel(object sender, System.Windows.Input.MouseWheelEventArgs e) 
     { 
      scrollviewer1.ScrollToVerticalOffset(scrollviewer1.VerticalOffset - e.Delta); 
     } 
    } 
} 
+0

Horizo​​ntalScrollBarVisibilityPropertyがWPFに存在しません 私が提案している内容は次のとおりです。 myDataGrid.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled; しかし、それは私が達成したいものではありません。 ScrollViewerをスクロールしているときにグリッドをマウスが通過しているときに、グリッド上でスクロールイベントを削除したい場合 –

+0

Horizo​​ntalScrollBarVisibilityPropertyがWPFで利用できないと言った人はいますか? これは、データグリッドで使用できます。あなたの質問は、データグリッドのスクロールを無効にする方法でしたか? – ViVi

+0

私は、Horizo​​ntalScrollBarVisibilityPropertyがSetValueからアクセスできないことを示す編集を行いました。しかし、これは私の質問ではありません。私はスクロールバーの可視性を隠したくありません。私は、私のグリッドがScrollViewerのスクロールを妨げないようにしたい。コードを実行してマウスをDataGridに置くと、scrollViewerをスクロールできなくなります。私はこれが起こることを望んでいない。 –

関連する問題