2016-07-25 1 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

'Brush'를'bool'로 변환하려고합니다. bool bools = Convert.ToBoolean (savedColor.Background);'??? – ad1Dima

+1

저장하려는 색상 값이 일부 브러시가 아닙니다. 브러시는 다양한 색상을 가진 모든 종류의 것을 나타낼 수 있습니다. ColorSlider_ValueChanged에있는 Color.FromRGB() 값을 원합니다. 개인 필드에 저장하십시오. –

+0

나는 이제 내가 내가 생각한 것만 큼 명확하지 않다는 것을 깨닫는다. Slider 값 0-255를 사용하여 각각의 색상 스펙트럼을 표현한 다음 해당 값을 에 입력합니다. 색상 color = Color.FromRgb ((byte) slColorR.Value, (byte) slColorG.Value, (byte) slColorB.Value); 그러면 해당 색상이 적용되고 저장됩니다. 저장 한 색상을로드 한 다음 해당 색상을 각각의 rgb 값으로 나누고 해당 값을 rgb 슬라이더에 다시 넣고 싶습니다. 난 그냥 슬라이더 값을 저장하지만 내가 할 수없는 오류가 나타납니다 개인 무효 ColorSlider_ValueChanged 클래스. –

답변

0

나는 당신이 색상을 저장하려고 방법을 이해하고 있지 않다. 그러나이 SolidColorBrush에서 Color 속성입니다, 그래서 당신은 그 모든 색상 구성 요소를 수행 할 수 있습니다

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

관련 항목 .Color : '브러시'에는 '색상'에 대한 정의가없고 확장 방법이 없습니다 '브러시'유형의 첫 번째 인수를 허용하는 '색상'을 찾을 수 있습니다 (지시어 또는 어셈블리 참조가 누락 되었습니까?) –

+0

@Planet_Earth'Brush'는 no를 가지며, 'SolidColorBrush'는 하나를 가지고 있습니다. 나는 당신이 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; } 
} 

.