Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Затемнение родительского окна (wpf)

#c_sharp #wpf


Те кто работал с delphi должны понять о чем речь, при открытии в модальном окне дочернего
окна, нужно сделать затемнение родительского, кто знает как это сделать в wpf?
А то у нас окон много, и при открытии они немного сливаются по цветам...вообщем нужно
затемнить прошлое окно, есть идеи?    


Ответы

Ответ 1



Если не ошибаюсь, вам надо вот это /// /// Apply Blur Effect on the window /// /// private void ApplyEffect(Window win) { System.Windows.Media.Effects.BlurEffect objBlur = new System.Windows.Media.Effects.BlurEffect(); objBlur.Radius = 4; win.Effect = objBlur; } /// /// Remove Blur Effects /// /// private void ClearEffect(Window win) { win.Effect = null; } и, собственно, применение: private void btnShowDialog_Click(object sender, RoutedEventArgs e) { WinModalDialog objModal = new WinModalDialog(); objModal.Owner = this; ApplyEffect(this); objModal.ShowDialog(); ClearEffect(this); }

Ответ 2



Для начала полезные ссылки: Shazzam Shader Editor Windows Presentation Foundation Pixel Shader Effects Library Ссылка на готовый проект (Github) SilverShader – Introduction to Silverlight and WPF Pixel Shaders Создаёшь библиотеку типа WPF User Control Library, называешь её Controls. Удаляешь из вновь созданного проекта UserControl. Создаёшь папку Shaders. Добавляешь класс: TintShaderEffect.cs using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.Effects; namespace Controls.Shaders { public class TintShaderEffect : ShaderEffect { public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty( "Input", typeof(TintShaderEffect), 0); public static readonly DependencyProperty TintColorProperty = DependencyProperty.Register( "TintColor", typeof(Color), typeof(TintShaderEffect), new PropertyMetadata(Color.FromArgb(255, 230, 179, 77), PixelShaderConstantCallback(0))); public Brush Input { get { return ((Brush)(GetValue(InputProperty))); } set { SetValue(InputProperty, value); } } /// The tint color. public Color TintColor { get { return ((Color)(this.GetValue(TintColorProperty))); } set { SetValue(TintColorProperty, value); } } public TintShaderEffect() { string name = AssemblyHelper.GetExecutingAssemblyName(); Uri uri = new Uri("pack://application:,,,/" + name + ";component/Shaders/TintShaderEffect.ps", UriKind.RelativeOrAbsolute); PixelShader pixelShader = new PixelShader(); pixelShader.UriSource = uri; PixelShader = pixelShader; UpdateShaderValue(InputProperty); UpdateShaderValue(TintColorProperty); } } } Добавляешь в проект в папку Shaders файл TintShader.fx, который содержит: TintShader.fx /// The tint color. /// Color /// 0,0,0,0, /// 1,1,1,1 /// 0.9,0.7,0.3,1 float4 TintColor : register(C0); // Sampler sampler2D TextureSampler : register(S0); // Shader float4 main(float2 uv : TEXCOORD) : COLOR { // Sample the original color at the coordinate float4 color = tex2D(TextureSampler, uv); // Convert the color to gray float gray = dot(color, float4(0.3, 0.59, 0.11, 0)); // Create the gray color with the original alpha value float4 grayColor = float4(gray, gray, gray, color.a); // Return the tinted pixel return grayColor * TintColor; } Устанавливаешь Shazzam Shader Editor. Выбираешь в программе File -> New_Shader File. Выбираешь место сохранения и называешь файл TintShader.fx. Далее вставляешь в редакторе код шейдера, который показан выше. Выбираешь в меню Tools -> Compile Shader. Далее выбираешь Tools -> Explore Compiled Shaders. Ищешь и открываешь папку TintShaderEffect (название зависит от того, как ты назвал файл шейдера). Копируешь в проект в папку Shaders файл TintShaderEffect.ps, у файла выставляешь Действие при построении (Build Action) в Resource. Добавляешь класс в корень проекта Controls AssemblyHelper.cs using System.Reflection; namespace Controls { public static class AssemblyHelper { public static string GetExecutingAssemblyName() { return Assembly.GetExecutingAssembly().GetName().Name; } } } Далее добавляешь в проект Controls класс CustomWindow.cs using Controls.Shaders; using System; using System.Windows; using System.Windows.Media; using System.Windows.Media.Effects; namespace Controls { public class CustomWindow : Window { public CustomWindow() { Loaded += CustomWindow_Loaded; } private void CustomWindow_Loaded(object sender, RoutedEventArgs e) { ActivateDisabledEffect(); } private void CustomWindow_Closed(object sender, EventArgs e) { DeactivateDisabledEffect(); } public static readonly DependencyProperty IsAutoShadingEnabledProperty = DependencyProperty.Register( "IsAutoShadingEnabled", typeof(bool), typeof(CustomWindow), new PropertyMetadata(true, new PropertyChangedCallback(IsAutoShadingEnabledPropertyChanged))); public static readonly DependencyProperty DisabledEffectProperty = DependencyProperty.Register( "DisabledEffect", typeof(Effect), typeof(CustomWindow), new PropertyMetadata( new TintShaderEffect() { TintColor = Colors.LightGray }, new PropertyChangedCallback(EffectPropertiesChanged))); public static readonly DependencyProperty UseDisabledEffectProperty = DependencyProperty.Register( "UseDisabledEffect", typeof(bool), typeof(CustomWindow), new PropertyMetadata(false, new PropertyChangedCallback(EffectPropertiesChanged))); public static readonly DependencyProperty UseDisabledEffectInternalProperty = DependencyProperty.Register( "UseDisabledEffectInternal", typeof(bool), typeof(CustomWindow), new PropertyMetadata(false, new PropertyChangedCallback(EffectPropertiesChanged))); private bool UseDisabledEffectInternal { get { return (bool)GetValue(UseDisabledEffectInternalProperty); } set { SetValue(UseDisabledEffectInternalProperty, value); } } public bool IsAutoShadingEnabled { get { return (bool)GetValue(IsAutoShadingEnabledProperty); } set { SetValue(IsAutoShadingEnabledProperty, value); } } public bool UseDisabledEffect { get { return (bool)GetValue(UseDisabledEffectProperty); } set { SetValue(UseDisabledEffectProperty, value); } } public Effect DisabledEffect { get { return (Effect)GetValue(DisabledEffectProperty); } set { SetValue(DisabledEffectProperty, value); } } private static void IsAutoShadingEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (CustomWindow)d; if (control.UseDisabledEffectInternal) { control.UseDisabledEffectInternal = false; } } private static void EffectPropertiesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var control = (CustomWindow)d; SetEffect(control); } private static void SetEffect(CustomWindow control) { if (!control.UseDisabledEffectInternal && !control.UseDisabledEffect) { control.Effect = null; } else if (control.UseDisabledEffect) { control.Effect = control.DisabledEffect; } else if (control.UseDisabledEffectInternal) { control.Effect = control.DisabledEffect; } } private void ActivateDisabledEffect() { if (Owner != null) { var window = Owner as CustomWindow; if (window != null) { Closed -= CustomWindow_Closed; Closed += CustomWindow_Closed; if (window.IsAutoShadingEnabled) { window.UseDisabledEffectInternal = true; } } } } private void DeactivateDisabledEffect() { var window = Owner as CustomWindow; if (window != null) { if (window.IsAutoShadingEnabled) { window.UseDisabledEffectInternal = false; } } } } } Создаёшь основной проект, например, назвав его Wpf_Shaders. Проект содержит в себе следующий код: MainWindow.xaml

Комментариев нет:

Отправить комментарий