2016-07-25 72 views
-1

我正在嘗試創建一個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; 
    } 
} 

下面是節目的圖像:第一框包含顏色滑塊;第二個盒子包含彩色滑塊的顏色;第三個框包含第二個框中保存的顏色。

Image of program

+1

你在做什麼轉換'刷'到'布爾''bool bools = Convert.ToBoolean(savedColor.Background);'??? – ad1Dima

+1

要保存的顏色值不是某個畫筆;畫筆可以代表各種顏色多樣的東西。你需要ColorSlider_ValueChanged中的Color.FromRGB()值。只需將它保存在私人領域。 –

+0

我現在意識到自己並不像我想的那麼清楚。 (字節)slColorR.Value,(字節)slColorG.Value,(字節) 我使用Slider值0-255來表示每個相應的色譜,然後將這些值應用於 Color color = Color.FromRgb )slColorB.Value); 然後我申請並保存該顏色。 我想加載保存的顏色,然後將其分解爲各自的rgb值並將這些值放回到rgb滑塊中。 我只會保存滑塊值,但我收到的錯誤,我不能這樣做私人無效ColorSlider_ValueChanged類以外。 –

回答

0

我不明白你怎麼想救你的顏色。但在SolidColorBrushColor屬性,因此你可以把所有顏色分量從:

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

關於.Color: 'Brush'不包含'Color'的定義,並且沒有可以找到接受類型'Brush'的第一個參數的擴展方法'Color'(您是否缺少指令或程序集引用? ) –

+0

@Planet_Earth'筆刷'沒有,'SolidColorBrush'有一個。我想你必須'var red =((SolidColorBrush)savedColor.Background).Color.R; – ad1Dima

+0

這對我來說比較新鮮。你是否建議我另存爲SolidColorBrush,或嘗試將我的顏色作爲SolidColorBrush調用? –

0

可以使用屬性,通過實現INotifyPropertyChanged接口,並且綁定屬性對應的值滑塊做到這一點。例如:

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; } 
} 

BackGroundColor是隻讀字段,它會改變任何改變相關聯的整數值。