前提・実現したいこと
初歩的な話で大変申し訳ないのですが、
組み方が良く分からないので質問させてください。
【WPF】Rectangleの線の色「Brushes.Red」などを、文字列で指定したい
https://teratail.com/questions/344646
上記で頂いている「TN8001」様の回答をもとに
データをClassファイルに分けて他のxamlからも参照出来るようにしたいと思っています。
・他から参照できるよう、NowData.csクラスに値を入れたい
Classを作成し、そこで値を共有(?)することは出来ています。
ただ、今回のは複雑だからか上手くいかず、コンボボックスに何も表示されません。
・全部のxamlから参照できるDictionaryは作成できるのか
(コンボボックスの選択肢項目は共通なので、1つの場所で管理出来たらいいなと思っています)
改変していますが、なぜコンボボックスに何も表示されないのか分からず
手詰まりの状態です。
コメントアウトしているところを、表示にしたり非表示にしたりしてテストしていました。
たぶん初歩的な話なのだと思いますが、
申し訳ありませんが教えて頂けると嬉しいです。
発生している問題・エラーメッセージ
xaml
<Window x:Class="TEST1.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:TEST1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources></Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC2" Margin="5" ItemsSource="{Binding Colors}" SelectedValue="{Binding DefoColors}" SelectedValuePath="Key" SelectionChanged="BordColorC2_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <DockPanel> <Ellipse Width="16" Height="16" Fill="{Binding Value}" /> <TextBlock Margin="5,0" VerticalAlignment="Center" Text="{Binding Key}" /> </DockPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DockPanel> <Rectangle Name="Rectan2" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </Window>
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace TEST1 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) { var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; Rectan2.Stroke = pair.Value; } } }
cs
//NowData.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media; namespace TEST1 { class NowData { public static string NowBordColor { get; set; } } //public static Dictionary<string, SolidColorBrush> Colors { get; } = // new Dictionary<string, SolidColorBrush> // { // {"Red", Brushes.Red }, // {"Blue", Brushes.Blue }, // {"Green", Brushes.Green }, // {"白", Brushes.White }, // {"黒", Brushes.Black }, // {"透明", Brushes.Transparent }, // }; }
App.xaml
<Application x:Class="TEST1.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:TEST1" xmlns:System="clr-namespace:System;assembly=mscorlib" StartupUri="MainWindow.xaml"> <Application.Resources> <x:Array x:Key="Colors" Type="System:String"> <System:String>Transparent</System:String> <System:String>Red</System:String> <System:String>Blue</System:String> <System:String>Green</System:String> <System:String>White</System:String> <System:String>Black</System:String> </x:Array> </Application.Resources> </Application>
参考にさせて頂いているソース
xaml
<Window x:Class="Questions344646.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:System="clr-namespace:System;assembly=mscorlib" Width="600" Height="400" Background="LightGray"> <Window.Resources> <x:Array x:Key="Colors" Type="System:String"> <System:String>Red</System:String> <System:String>Blue</System:String> <System:String>Green</System:String> <System:String>White</System:String> <System:String>Black</System:String> <System:String>NoColor</System:String> </x:Array> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <GroupBox Header="BrushConverter"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC" Margin="5" ItemsSource="{StaticResource Colors}" SelectedValue="{Binding DefoBordColor}" SelectionChanged="BordColorC_SelectionChanged" /> </DockPanel> <Rectangle Name="Rectan" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </GroupBox> <GroupBox Grid.Column="1" Header="Dictionary"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <DockPanel> <TextBlock VerticalAlignment="Center" Text="線の色" /> <ComboBox x:Name="BordColorC2" Margin="5" ItemsSource="{Binding Colors}" SelectedValue="{Binding DefoBordColor2}" SelectedValuePath="Key" SelectionChanged="BordColorC2_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <DockPanel> <Ellipse Width="16" Height="16" Fill="{Binding Value}" /> <TextBlock Margin="5,0" VerticalAlignment="Center" Text="{Binding Key}" /> </DockPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> </DockPanel> <Rectangle Name="Rectan2" Grid.Row="1" Width="120" Height="100" Stroke="Black" StrokeThickness="2" /> </Grid> </GroupBox> </Grid> </Window>
C#
using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace Questions344646 { public class DefaultData { public static string DefoBordColor { get => Properties.Settings.Default.DefaBordColor; set => Properties.Settings.Default.DefaBordColor = value; } public static string DefoBordColor2 { get => Properties.Settings.Default.DefaBordColor2; set => Properties.Settings.Default.DefaBordColor2 = value; } public static Dictionary<string, SolidColorBrush> Colors { get; } = new Dictionary<string, SolidColorBrush> { {"Red", Brushes.Red }, {"Blue", Brushes.Blue }, {"Green", Brushes.Green }, {"白", Brushes.White }, {"黒", Brushes.Black }, {"透明", Brushes.Transparent }, }; } public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // xamlから逆算するとこうなっているってこと??(ちょっと変わってますね^^; DataContext = new DefaultData(); } protected override void OnClosing(CancelEventArgs e) { Properties.Settings.Default.Save(); } private void BordColorC_SelectionChanged(object sender, SelectionChangedEventArgs e) { var name = BordColorC.SelectedItem.ToString(); try { var brush = (SolidColorBrush)new BrushConverter().ConvertFromString(name); Rectan.Stroke = brush; } catch { Rectan.Stroke = Brushes.Transparent; } } private void BordColorC2_SelectionChanged(object sender, SelectionChangedEventArgs e) { var pair = (KeyValuePair<string, SolidColorBrush>)BordColorC2.SelectedItem; Rectan2.Stroke = pair.Value; } } }
補足情報(FW/ツールのバージョンなど)
VisualStudio 2019
.NET Framework 4.5⇒4.7.2にバージョンアップ
WPF C# (※ WinFormではない)
まだ回答がついていません
会員登録して回答してみよう