2016-07-25 3 views
-1

3つのスライダーバー(赤、緑、青)に基づいて色を選択できるWPFプログラムを作成しようとしています。スライダからのrgb値に基づいて、サンプルボックスと後のボックスに保存されます。C#/ WPF色をダブル変換する

問題:保存された色を[後で保存]ボックスからスライダ値に戻すことができる値に戻す方法がわかりません。私は保存された色を適用することができますが、それは私が望む保存された色の値です。このコードは、クリックしてClick_savedColorを開始してからプログラムがフリーズするまでコンパイルされて実行されます。

WPFコード:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <StackPanel Margin="10" VerticalAlignment="Center"> 
     <DockPanel VerticalAlignment="Center" Margin="10"> 
      <Label DockPanel.Dock="Left" FontWeight="Bold">R:</Label> 
      <TextBox Text="{Binding ElementName=slColorR, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" /> 
      <Slider Name="slColorR" Maximum="255" TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True" ValueChanged="ColorSlider_ValueChanged" /> 
     </DockPanel> 

     <DockPanel VerticalAlignment="Center" Margin="10"> 
      <Label DockPanel.Dock="Left" FontWeight="Bold">G:</Label> 
      <TextBox Text="{Binding ElementName=slColorG, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" /> 
      <Slider Name="slColorG" Maximum="255" TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True" ValueChanged="ColorSlider_ValueChanged" /> 
     </DockPanel> 

     <DockPanel VerticalAlignment="Center" Margin="10"> 
      <Label DockPanel.Dock="Left" FontWeight="Bold">B:</Label> 
      <TextBox Text="{Binding ElementName=slColorB, Path=Value, UpdateSourceTrigger=PropertyChanged}" DockPanel.Dock="Right" TextAlignment="Right" Width="40" /> 
      <Slider Name="slColorB" Maximum="255" TickPlacement="BottomRight" TickFrequency="1" IsSnapToTickEnabled="True" ValueChanged="ColorSlider_ValueChanged" /> 
     </DockPanel> 
    </StackPanel> 
    <GridSplitter Name="test" HorizontalAlignment="Center"/> 
    <Button Name="compColor" Grid.Column="2" Click="Click_compColor"/> 
    <GridSplitter HorizontalAlignment="Right"/> 
    <Button Name="savedColor" Grid.Column="3" Click="Click_savedColor"/> 

</Grid> 

C#コード:以下

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void ColorSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     Color color = Color.FromRgb((byte)slColorR.Value, (byte)slColorG.Value, (byte)slColorB.Value); 
     compColor.Background = new SolidColorBrush(color); 
    } 

    void Click_compColor(object sender, RoutedEventArgs e) 
    { 
     savedColor.Background = compColor.Background; 
    } 

    void Click_savedColor(object sender, RoutedEventArgs e) 
    { 
     bool bools = Convert.ToBoolean(savedColor.Background); 
     byte[] bytes = BitConverter.GetBytes(bools); 

     slColorR.Value = Convert.ToDouble(bytes[0]); 
     slColorG.Value = Convert.ToDouble(bytes[1]); 
     slColorB.Value = Convert.ToDouble(bytes[2]); 

     compColor.Background = savedColor.Background; 
    } 
} 

は、番組の画像である:最初のボックスは、カラースライダを含み、 2番目のボックスにはカラースライダの色が含まれています。 3番目のボックスには2番目のボックスから保存された色が含まれます

Image of program

+1

'Brush'を' bool'に変換しようとしていますか?bool bools = Convert.ToBoolean(savedColor.Background); '??? – ad1Dima

+1

保存したいカラー値はブラシではありません。ブラシは、多くの色を持つあらゆる種類のものを表すことができます。 ColorSlider_ValueChangedで取得したColor.FromRGB()値が必要です。それをプライベートフィールドに保存するだけです。 –

+0

今私は私が思ったほど明確ではなかったことを理解しています。 Sliderの値0〜255を使用して、それぞれの色のスペクトルを表してから、それらの値を適用します。 色の色= Color.FromRgb((byte)slColorR.Value、(byte)slColorG.Value、 )slColorB.Value); この色を適用して保存します。 保存された色を読み込み、それをそれぞれのRGB値に分解し、それらの値をRGBスライダに戻したいとします。 私はスライダーの値を保存するだけですが、private void ColorSlider_ValueChangedクラスの外ではできないエラーが発生します。 –

答えて

0

私はあなたの色を保存しようとどのように理解していませんよ。あなたはそれからすべての色成分を取ることができますので、しかし、Colorプロパティは、SolidColorBrushにあります:

var red = savedColor.Background.Color.R; 
var green = savedColor.Background.Color.G; 
var blue = savedColor.Background.Color.B; 
+0

に関して.Color: 'ブラシ'には '色'の定義が含まれておらず、拡張メソッドがありません。 'ブラシ'タイプの最初の引数を受け入れる '色'が見つかりました(指示またはアセンブリ参照がありませんか? ) –

+0

@Planet_Earth 'Brush'はいいえ、' SolidColorBrush'は1つを持っています。私はあなたが 'var red =((SolidColorBrush)savedColor.Background).Color.R; – ad1Dima

+0

これは比較的新しいものです。 SolidColorBrushとして保存するか、SolidColorBrushとして自分の色を呼び出しようとしていますか? –

0

あなたはINotifyPropertyChangedのインターフェイスを実装し、対応する値スライダへのプロパティを結合することによって、プロパティを使用してそれを行うことができます。例えば:BackGroundColorが変更関連する整数値のいずれかを変更します読み取り専用フィールドである

private int _GreenValue; 
private int _RedValue; 
private int _BlueValue; 
private Color _BackGroundColor; 


public int GreenValue 
{ 
    get { return _GreenValue; } 
    set 
    { 
     _GreenValue = value; 
     _BackGroundColor = Color.FromArgb(_RedValue, _GreenValue, _BlueValue); 
    } 
} 
public int MyProperty 
{ 
    get { return _RedValue; } 
    set 
    { 
     _RedValue = value; 
     _BackGroundColor = Color.FromArgb(_RedValue, _GreenValue, _BlueValue); 
    } 
} 
public int BlueValue 
{ 
    get { return _BlueValue; } 
    set 
    { 
     _BlueValue = value; 
     _BackGroundColor = Color.FromArgb(_RedValue, _GreenValue, _BlueValue); 
    } 
} 

public Color BackGroundColor 
{ 
    get { return _BackGroundColor; } 
} 

関連する問題