문제

사용자가 컬러 피커 대화 상자에서 색상을 선택한 다음 ( DynamicResource)

에 거주하는 특정 자원을 변경하는 방법은 어떻게해야합니까? app.xaml ?


나는 이와 같은 것을 시도했지만 운이 없습니다 (단지 시험) :

var colorDialog = new CustomControls.ColorPickerDialog();
var dResult = colorDialog.ShowDialog();
var x = Application.Current.Resources.Values.OfType<LinearGradientBrush>().First();
x = new LinearGradientBrush();
x.GradientStops.Add(new GradientStop(colorDialog.SelectedColor,1));

이것은 발췌 app.xaml 파일:

<Application.Resources>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0" x:Key="HeaderBackground">
            <GradientStop Color="#82cb02" Offset="1"/>
            <GradientStop Color="#82cb01" Offset="0.2"/>
            <GradientStop Color="#629a01" Offset="0.5"/>
        </LinearGradientBrush>

이러한 형태의 사용자 정의 가능성 (기본적으로 일부 색상 변경)을 애플리케이션으로 허용하는 가장 좋은 방법은 무엇입니까?


업데이트

방금 찾았습니다 이 답변 요청한 이전 질문에서 시도했지만 시도했지만 나는 똑같이 받고 있습니다. InvalidoPerationException 주어진 답변에 대한 의견에 언급 된 Petoj 예외. 다음은 답의 샘플 코드입니다.

XAML:

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
    <GradientBrush.GradientStops>
        <GradientStop Color="Blue" Offset="0" />
        <GradientStop Color="Black" Offset="1" />
    </GradientBrush.GradientStops>
</LinearGradientBrush>

씨#:

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush.GradientStops[0].Color = Colors.Red;
도움이 되었습니까?

해결책

당신이 일종의 스키닝을하려고하는 것 같습니까?

별도의 파일에 포함 된 리소스 사전에서 리소스를 정의하는 것이 좋습니다. 그런 다음 코드 (app.cs)에서 (기본값을로드하려면 다른 곳을 변경하려면) 리소스를 다음과 같이로드 할 수 있습니다.

//using System.Windows
ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("MyResourceDictionary.xaml", UriKind.Relative);

Application.Current.Resources.MergedDictionaries.Add(dict);

App.xaml에서 기본 리소스 사전을 정의하고 코드로 언로드 할 수도 있습니다.

mengedDictionaries 객체를 사용하여 런타임에 사용중인 사전을 변경하십시오. 전체 인터페이스를 빠르게 변경하는 데있어 매력처럼 작동합니다.

다른 팁

런타임에서 애플리케이션 광범위한 리소스 변경은 다음과 같습니다.

Application.Current.Resources("MainBackgroundBrush") = Brsh

InvalidOperationException에 대해 WallStreet 프로그래머가 옳다고 생각합니다. 아마도 기존 브러시를 수정하지 말고 필요한 모든 그라데이어 스톱과 함께 코드로 새 브러시를 작성한 다음이 새 브러시를 애플리케이션 리소스에 할당 할 수 있습니다.

일부 그라데이어 스톱의 색상을 변경하는 또 다른 접근법은 해당 색상을 Application wide SolidColorBrushes에 대한 DynamicResource 참조로 정의하는 것입니다.

<LinearGradientBrush x:Key="MainBrush" StartPoint="0, 0.5" EndPoint="1, 0.5" >
<GradientBrush.GradientStops>
    <GradientStop Color="{DynamicResource FirstColor}" Offset="0" />
    <GradientStop Color="{DynamicResource SecondColor}" Offset="1" />
</GradientBrush.GradientStops>

그리고 사용하십시오

Application.Current.Resources["FirstColor"] = NewFirstColorBrsh
Application.Current.Resources["SecondColor"] = NewSecondColorBrsh

HTH

사용 Clone() 브러시의 깊은 사본 (또는 다른 동결 가능한 물체와 같은 다른 물체를 만드는 방법 Storyboard) 그리고 그것을 사용하십시오 :

LinearGradientBrush myBrush = FindResource("MainBrush") as LinearGradientBrush;
myBrush = myBrush.Clone();
myBrush.GradientStops[0].Color = Colors.Red;

@WallStreetProgrammer가 맞습니다. 모든 응용 프로그램 레벨 리소스는 기본적으로 동결됩니다.

그래서 먼저 물체를 복제해야합니다.

얼어 붙은 물체를 수정하려고하기 때문에 예외가 발생합니다. 모든 애플리케이션 레벨 리소스는 동결 가능하고 LineargradientBrush라면 자동으로 동결됩니다. 창과 같은 하위 레벨에 추가하면 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top