実現したいこと
XAMLをC#で記述して下記を作っています。
①ボタンを押すごとにImageが1つの画面、2つの画面と切り替えられる。
(お試しなので1つ目の画面のみImageを追加)
②Imageの1つ目はマウスホイールによる挙動等のイベントを追加したい。
発生している問題・エラーメッセージ
①下記のソースコードでは、ボタンを押すごとにRowが追加されていってしまいます。
②マウスホイール関数のGetPositionにあるScrollViewer.Nameの設定方法がわかりません。
該当のソースコード
XAML
1<Window x:Class="WpfApp1.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 10 <Grid> 11 <Grid ShowGridLines="True"> 12 <Grid.RowDefinitions> 13 <RowDefinition Height="*"/> 14 <RowDefinition Height="10*"/> 15 <RowDefinition Height="*"/> 16 </Grid.RowDefinitions> 17 <Grid.ColumnDefinitions> 18 <ColumnDefinition Width="*"/> 19 <ColumnDefinition Width="10*"/> 20 <ColumnDefinition Width="*"/> 21 </Grid.ColumnDefinitions> 22 <Grid Name="grid1" Grid.Row="1" Grid.Column="1" /> 23 24 <StackPanel Grid.Row="1" Grid.Column="2"> 25 <Button Click="Button_Click">test1</Button> 26 </StackPanel> 27 </Grid> 28 </Grid> 29</Window>
C#
1using System.Windows; 2using System.Windows.Controls; 3using System.Windows.Input; 4using System.Windows.Media; 5using System.Windows.Media.Imaging; 6using System.IO; 7 8namespace WpfApp1 9{ 10 /// <summary> 11 /// MainWindow.xaml の相互作用ロジック 12 /// </summary> 13 public partial class MainWindow : Window 14 { 15 BitmapImage _bmpImage1; 16 System.Windows.Controls.Image _image1; 17 18 public MainWindow() 19 { 20 InitializeComponent(); 21 22 BitmapImage bmpImage = new BitmapImage(); 23 using (FileStream stream = File.OpenRead(@"./image1.png")) 24 { 25 bmpImage.BeginInit(); 26 bmpImage.StreamSource = stream; 27 bmpImage.DecodePixelWidth = 500; 28 bmpImage.CacheOption = BitmapCacheOption.OnLoad; 29 bmpImage.CreateOptions = BitmapCreateOptions.None; 30 bmpImage.EndInit(); 31 bmpImage.Freeze(); 32 } 33 34 _bmpImage1 = bmpImage; 35 36 } 37 38 private bool flg = true; 39 private void Button_Click(object sender, RoutedEventArgs e) 40 { 41 /* 42 * ここでgrid1にある内容をクリアできればいい? 43 */ 44 45 CreateImageViewer(flg); 46 47 flg = !flg; 48 } 49 50 private void CreateImageViewer(bool flg) 51 { 52 if (flg) 53 { 54 grid1.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(15.0d) }); 55 grid1.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1.0, GridUnitType.Star) }); 56 57 Border border1 = new Border(); 58 Thickness marginThickness1 = new Thickness(5, 0, 5, 0); 59 border1.Margin = marginThickness1; 60 border1.Background = System.Windows.Media.Brushes.Gray; 61 Grid.SetRow(border1, 0); 62 63 TextBlock txt1 = new TextBlock(); 64 txt1.Foreground = System.Windows.Media.Brushes.Black; 65 txt1.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 66 txt1.VerticalAlignment = VerticalAlignment.Center; 67 txt1.Text = "image1"; 68 69 border1.Child = txt1; 70 71 Border border2 = new Border(); 72 Grid.SetRow(border2, 1); 73 Thickness marginThickness2 = new Thickness(5, 0, 5, 5); 74 border2.Margin = marginThickness2; 75 border2.Background = System.Windows.Media.Brushes.Silver; 76 77 ScrollViewer scrollViewer = new ScrollViewer(); 78 scrollViewer.Name = "ScrollViewer1"; 79 scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; 80 scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; 81 scrollViewer.PreviewMouseWheel += new MouseWheelEventHandler(ScrollViewer_PreviewMouseWheel); 82 83 _image1 = new System.Windows.Controls.Image(); 84 _image1.Name = "image1"; 85 _image1.Source = _bmpImage1; 86 border2.Child = _image1; 87 88 grid1.Children.Add(border1); 89 grid1.Children.Add(border2); 90 } 91 else 92 { 93 grid1.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1.0, GridUnitType.Star) }); 94 grid1.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1.0, GridUnitType.Star) }); 95 96 // 上半分 97 Grid grid2 = new Grid(); 98 grid2.ShowGridLines = true; 99 100 grid2.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(15.0d) }); 101 grid2.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1.0, GridUnitType.Star) }); 102 103 Border border1 = new Border(); 104 Thickness marginThickness1 = new Thickness(5, 0, 5, 0); 105 border1.Margin = marginThickness1; 106 border1.Background = System.Windows.Media.Brushes.Gray; 107 Grid.SetRow(border1, 0); 108 109 TextBlock txt1 = new TextBlock(); 110 txt1.Foreground = System.Windows.Media.Brushes.Black; 111 txt1.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 112 txt1.VerticalAlignment = VerticalAlignment.Center; 113 txt1.Text = "image2"; 114 115 border1.Child = txt1; 116 117 Border border2 = new Border(); 118 Grid.SetRow(border2, 1); 119 Thickness marginThickness2 = new Thickness(5, 0, 5, 5); 120 border2.Margin = marginThickness2; 121 border2.Background = System.Windows.Media.Brushes.Silver; 122 123 124 grid2.Children.Add(border1); 125 grid2.Children.Add(border2); 126 127 grid1.Children.Add(grid2); 128 129 // 下半分 130 Grid grid3 = new Grid(); 131 132 Grid.SetRow(grid3, 1); 133 grid3.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(15.0d) }); 134 grid3.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1.0, GridUnitType.Star) }); 135 136 Border border3 = new Border(); 137 Thickness marginThickness3 = new Thickness(5, 0, 5, 0); 138 border3.Margin = marginThickness3; 139 border3.Background = System.Windows.Media.Brushes.Gray; 140 Grid.SetRow(border3, 0); 141 142 TextBlock txt2 = new TextBlock(); 143 txt2.Foreground = System.Windows.Media.Brushes.Black; 144 txt2.HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 145 txt2.VerticalAlignment = VerticalAlignment.Center; 146 txt2.Text = "image3"; 147 148 border3.Child = txt2; 149 150 Border border4 = new Border(); 151 Thickness marginThickness4 = new Thickness(5, 0, 5, 5); 152 border4.Margin = marginThickness4; 153 border4.Background = System.Windows.Media.Brushes.Silver; 154 155 Grid.SetRow(border4, 1); 156 157 grid3.Children.Add(border3); 158 grid3.Children.Add(border4); 159 160 grid1.Children.Add(grid3); 161 } 162 } 163 164 // マウスを押下した点を保存 165 System.Windows.Point _MouseDownStartPoint = new System.Windows.Point(0, 0); 166 // マウスの現在地 167 System.Windows.Point _MouseCurrentPoint = new System.Windows.Point(0, 0); 168 //画像倍率 169 double _dispScale = 1; 170 171 private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 172 { 173 //キャストではできないから他の方法を探すが見つけられません 174 _MouseCurrentPoint = e.GetPosition((IInputElement)"ScrollViewer1"); 175 176 var scale = 1.0; 177 178 if (e.Delta > 0) scale = 1.25; 179 else scale = 1 / 1.25; 180 181 var matrix = _image1.RenderTransform.Value; 182 183 matrix.ScaleAt(scale, scale, _MouseCurrentPoint.X, _MouseCurrentPoint.Y); 184 _image1.RenderTransform = new MatrixTransform(matrix); 185 186 _dispScale = _dispScale * scale; 187 } 188 } 189} 190
試したこと
上記の通りとなります。
①ではGridのクリアに類するものを探してみましたが見つけられませんでした。
②GetPositionの引数をどうすればよいかわかっていません。String→IInputElementのキャスト方法を調べましたがわかりませんでした。
何か解決策を教えていただければ幸いです。
補足情報(FW/ツールのバージョンなど)
VisualStudio2017
.Net Framework 4.8

回答1件
あなたの回答
tips
プレビュー