前提・実現したいこと
初歩的な話で大変申し訳ないのですが、
組み方が良く分からないので質問させてください。
【WPF】Rectangleの線の色「Brushes.Red」などを、文字列で指定したい
https://teratail.com/questions/344646
上記で頂いている「TN8001」様の回答をもとに
データをClassファイルに分けて他のxamlからも参照出来るようにしたいと思っています。
・他から参照できるよう、NowData.csクラスに値を入れたい
Classを作成し、そこで値を共有(?)することは出来ています。
ただ、今回のは複雑だからか上手くいかず、コンボボックスに何も表示されません。
・全部のxamlから参照できるDictionaryは作成できるのか
(コンボボックスの選択肢項目は共通なので、1つの場所で管理出来たらいいなと思っています)
改変していますが、なぜコンボボックスに何も表示されないのか分からず
手詰まりの状態です。
コメントアウトしているところを、表示にしたり非表示にしたりしてテストしていました。
たぶん初歩的な話なのだと思いますが、
申し訳ありませんが教えて頂けると嬉しいです。
発生している問題・エラーメッセージ
xaml
1<Window x:Class="TEST1.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:TEST1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 10 <Window.Resources></Window.Resources> 11 12 <Grid> 13 <Grid.RowDefinitions> 14 <RowDefinition Height="Auto" /> 15 <RowDefinition /> 16 </Grid.RowDefinitions> 17 <DockPanel> 18 <TextBlock VerticalAlignment="Center" Text="線の色" /> 19 <ComboBox 20 x:Name="BordColorC2" 21 Margin="5" 22 ItemsSource="{Binding Colors}" 23 SelectedValue="{Binding DefoColors}" 24 SelectedValuePath="Key" 25 SelectionChanged="BordColorC2_SelectionChanged"> 26 <ComboBox.ItemTemplate> 27 <DataTemplate> 28 <DockPanel> 29 <Ellipse Width="16" Height="16" Fill="{Binding Value}" /> 30 <TextBlock Margin="5,0" VerticalAlignment="Center" Text="{Binding Key}" /> 31 </DockPanel> 32 </DataTemplate> 33 </ComboBox.ItemTemplate> 34 </ComboBox> 35 </DockPanel> 36 <Rectangle 37 Name="Rectan2" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> 38 </Grid> 39</Window> 40
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using System.Text; 5using System.Threading.Tasks; 6using System.Windows; 7using System.Windows.Controls; 8using System.Windows.Data; 9using System.Windows.Documents; 10using System.Windows.Input; 11using System.Windows.Media; 12using System.Windows.Media.Imaging; 13using System.Windows.Navigation; 14using System.Windows.Shapes; 15 16namespace TEST1 17{ 18 /// <summary> 19 /// MainWindow.xaml の相互作用ロジック 20 /// </summary> 21 /// 22 public partial class MainWindow : Window 23 { 24 public MainWindow() 25 { 26 InitializeComponent(); 27 } 28 29 private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) 30 { 31 var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; 32 Rectan2.Stroke = pair.Value; 33 } 34 } 35 36}
cs
1//NowData.cs 2using System; 3using System.Collections.Generic; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7using System.Windows.Media; 8 9namespace TEST1 10{ 11 class NowData 12 { 13 public static string NowBordColor { get; set; } 14 } 15 16 //public static Dictionary<string, SolidColorBrush> Colors { get; } = 17 // new Dictionary<string, SolidColorBrush> 18 // { 19 // {"Red", Brushes.Red }, 20 // {"Blue", Brushes.Blue }, 21 // {"Green", Brushes.Green }, 22 // {"白", Brushes.White }, 23 // {"黒", Brushes.Black }, 24 // {"透明", Brushes.Transparent }, 25 // }; 26}
App.xaml
1<Application x:Class="TEST1.App" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:local="clr-namespace:TEST1" 5 xmlns:System="clr-namespace:System;assembly=mscorlib" 6 StartupUri="MainWindow.xaml"> 7 <Application.Resources> 8 <x:Array x:Key="Colors" Type="System:String"> 9 <System:String>Transparent</System:String> 10 <System:String>Red</System:String> 11 <System:String>Blue</System:String> 12 <System:String>Green</System:String> 13 <System:String>White</System:String> 14 <System:String>Black</System:String> 15 </x:Array> 16 </Application.Resources> 17</Application>
参考にさせて頂いているソース
xaml
1<Window 2 x:Class="Questions344646.MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:System="clr-namespace:System;assembly=mscorlib" 6 Width="600" 7 Height="400" 8 Background="LightGray"> 9 <Window.Resources> 10 <x:Array x:Key="Colors" Type="System:String"> 11 <System:String>Red</System:String> 12 <System:String>Blue</System:String> 13 <System:String>Green</System:String> 14 <System:String>White</System:String> 15 <System:String>Black</System:String> 16 <System:String>NoColor</System:String> 17 </x:Array> 18 </Window.Resources> 19 <Grid> 20 <Grid.ColumnDefinitions> 21 <ColumnDefinition /> 22 <ColumnDefinition /> 23 </Grid.ColumnDefinitions> 24 25 <GroupBox Header="BrushConverter"> 26 <Grid> 27 <Grid.RowDefinitions> 28 <RowDefinition Height="Auto" /> 29 <RowDefinition /> 30 </Grid.RowDefinitions> 31 <DockPanel> 32 <TextBlock VerticalAlignment="Center" Text="線の色" /> 33 <ComboBox 34 x:Name="BordColorC" 35 Margin="5" 36 ItemsSource="{StaticResource Colors}" 37 SelectedValue="{Binding DefoBordColor}" 38 SelectionChanged="BordColorC_SelectionChanged" /> 39 </DockPanel> 40 <Rectangle 41 Name="Rectan" 42 Grid.Row="1" 43 Width="120" 44 Height="100" 45 Stroke="Black" 46 StrokeThickness="2" /> 47 </Grid> 48 </GroupBox> 49 50 <GroupBox Grid.Column="1" Header="Dictionary"> 51 <Grid> 52 <Grid.RowDefinitions> 53 <RowDefinition Height="Auto" /> 54 <RowDefinition /> 55 </Grid.RowDefinitions> 56 <DockPanel> 57 <TextBlock VerticalAlignment="Center" Text="線の色" /> 58 <ComboBox 59 x:Name="BordColorC2" 60 Margin="5" 61 ItemsSource="{Binding Colors}" 62 SelectedValue="{Binding DefoBordColor2}" 63 SelectedValuePath="Key" 64 SelectionChanged="BordColorC2_SelectionChanged"> 65 <ComboBox.ItemTemplate> 66 <DataTemplate> 67 <DockPanel> 68 <Ellipse 69 Width="16" 70 Height="16" 71 Fill="{Binding Value}" /> 72 <TextBlock 73 Margin="5,0" 74 VerticalAlignment="Center" 75 Text="{Binding Key}" /> 76 </DockPanel> 77 </DataTemplate> 78 </ComboBox.ItemTemplate> 79 </ComboBox> 80 </DockPanel> 81 <Rectangle 82 Name="Rectan2" 83 Grid.Row="1" 84 Width="120" 85 Height="100" 86 Stroke="Black" 87 StrokeThickness="2" /> 88 </Grid> 89 </GroupBox> 90 </Grid> 91</Window>
C#
1using System.Collections.Generic; 2using System.ComponentModel; 3using System.Windows; 4using System.Windows.Controls; 5using System.Windows.Media; 6 7namespace Questions344646 8{ 9 public class DefaultData 10 { 11 public static string DefoBordColor 12 { 13 get => Properties.Settings.Default.DefaBordColor; 14 set => Properties.Settings.Default.DefaBordColor = value; 15 } 16 public static string DefoBordColor2 17 { 18 get => Properties.Settings.Default.DefaBordColor2; 19 set => Properties.Settings.Default.DefaBordColor2 = value; 20 } 21 22 public static Dictionary<string, SolidColorBrush> Colors { get; } = 23 new Dictionary<string, SolidColorBrush> 24 { 25 {"Red", Brushes.Red }, 26 {"Blue", Brushes.Blue }, 27 {"Green", Brushes.Green }, 28 {"白", Brushes.White }, 29 {"黒", Brushes.Black }, 30 {"透明", Brushes.Transparent }, 31 }; 32 } 33 34 public partial class MainWindow : Window 35 { 36 public MainWindow() 37 { 38 InitializeComponent(); 39 40 // xamlから逆算するとこうなっているってこと??(ちょっと変わってますね^^; 41 DataContext = new DefaultData(); 42 } 43 44 protected override void OnClosing(CancelEventArgs e) 45 { 46 Properties.Settings.Default.Save(); 47 } 48 49 private void BordColorC_SelectionChanged(object sender, SelectionChangedEventArgs e) 50 { 51 var name = BordColorC.SelectedItem.ToString(); 52 try 53 { 54 var brush = (SolidColorBrush)new BrushConverter().ConvertFromString(name); 55 Rectan.Stroke = brush; 56 } 57 catch 58 { 59 Rectan.Stroke = Brushes.Transparent; 60 } 61 } 62 63 private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) 64 { 65 var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; 66 Rectan2.Stroke = pair.Value; 67 } 68 } 69}
補足情報(FW/ツールのバージョンなど)
VisualStudio 2019
.NET Framework 4.5⇒4.7.2にバージョンアップ
WPF C# (※ WinFormではない)
回答3件
あなたの回答
tips
プレビュー