Make empty Grid/Border clickable on WPF
If you set Background="Transparent"
for the grid/border it will resolve the issue.
References
https://www.noesisengine.com/forums/viewtopic.php?t=931
Daily Notes of a Programmer
If you set Background="Transparent"
for the grid/border it will resolve the issue.
References
https://www.noesisengine.com/forums/viewtopic.php?t=931
<StackPanel FocusManager.FocusedElement="{Binding ElementName=Box}"> <TextBox Name="Box" /> </StackPanel>
References
https://stackoverflow.com/questions/1345391/set-focus-on-textbox-in-wpf
Creating Generic HostBuilder
Nuget :
PM> Install-Package Microsoft.Extensions.Hosting -Version 3.1.2
The HostBuilder class is available from the following namespace,
using Microsoft.Extensions.Hosting;
Initialize the Host
Within Constructor of App class(file: App.xaml.cs) please add below code to build Host,
host = new HostBuilder() .ConfigureServices((hostContext, services) => { }).Build();
DI Container
host = new HostBuilder() .ConfigureServices((hostContext, services) => { //Add business services as needed services.AddScoped<IEmployeeViewModel, EmployeeViewModel>(); //Lets Create single tone instance of Master windows services.AddSingleton<EmployeeWindow>(); }).Build();
Setting up OnStartup and OnExit Application events
private void OnStartup(object sender, StartupEventArgs e) { var mainWindow = host.Services.GetService<EmployeeWindow>(); mainWindow.Show(); }
protected override async void OnExit(ExitEventArgs e) { using (host) { await host.StopAsync(); } base.OnExit(e); }
App.XAML file used as below,
<Application x:Class="WPFDesktopApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Startup="OnStartup"> <Application.Resources> </Application.Resources> </Application>
References
https://www.thecodebuzz.com/dependency-injection-wpf-generic-hostbuilder-net-core/
https://laurentkempe.com/2019/09/03/WPF-and-dotnet-Generic-Host-with-dotnet-Core-3-0/
var converter = new System.Windows.Media.BrushConverter(); var brush = (Brush)converter.ConvertFromString("#FFFFFF90"); Fill = brush;
References
https://stackoverflow.com/questions/6808739/how-to-convert-color-code-into-media-brush
Dispatcher.Invoke(() => { // Set property or change UI compomponents. });
Dispatcher.BeginInvoke(new Action(UpdateControls));
References
https://stephenhaunts.com/2015/06/12/update-a-wpf-ui-from-another-thread/
https://stackoverflow.com/questions/19009174/dispatcher-invoke-vs-begininvoke-confusion/
https://medium.com/criteo-engineering/switching-back-to-the-ui-thread-in-wpf-uwp-in-modern-c-5dc1cc8efa5e
<Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding" Title="ConverterSample" Height="140" Width="250"> <Window.Resources> <local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" /> </Window.Resources> <StackPanel Margin="10"> <TextBox Name="txtValue" /> <WrapPanel Margin="0,10"> <TextBlock Text="Current value is: " /> <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock> </WrapPanel> <CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" /> </StackPanel> </Window>
using System; using System.Windows; using System.Windows.Data; namespace WpfTutorialSamples.DataBinding { public partial class ConverterSample : Window { public ConverterSample() { InitializeComponent(); } } public class YesNoToBooleanConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { switch(value.ToString().ToLower()) { case "yes": case "oui": return true; case "no": case "non": return false; } return false; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if(value is bool) { if((bool)value == true) return "yes"; else return "no"; } return "no"; } } }
References
https://wpf-tutorial.com/data-binding/value-conversion-with-ivalueconverter/
<Window x:Class="WpfTutorialSamples.DataBinding.DataBindingDebuggingSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:self="clr-namespace:WpfTutorialSamples.DataBinding" Title="DataBindingDebuggingSample" Name="wnd" Height="100" Width="200"> <Window.Resources> <self:DebugDummyConverter x:Key="DebugDummyConverter" /> </Window.Resources> <Grid Margin="10"> <TextBlock Text="{Binding Title, ElementName=wnd, Converter={StaticResource DebugDummyConverter}}" /> </Grid> </Window>
using System; using System.Windows; using System.Windows.Data; using System.Diagnostics; namespace WpfTutorialSamples.DataBinding { public partial class DataBindingDebuggingSample : Window { public DataBindingDebuggingSample() { InitializeComponent(); } } public class DebugDummyConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Debugger.Break(); return value; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Debugger.Break(); return value; } } }
Events
class Counter { public event EventHandler ThresholdReached; protected virtual void OnThresholdReached(EventArgs e) { EventHandler handler = ThresholdReached; handler?.Invoke(this, e); } // provide remaining implementation for the class }
Event data
public class ThresholdReachedEventArgs : EventArgs { public int Threshold { get; set; } public DateTime TimeReached { get; set; } }
Event handlers
class Program { static void Main() { var c = new Counter(); c.ThresholdReached += c_ThresholdReached; // provide remaining implementation for the class } static void c_ThresholdReached(object sender, EventArgs e) { Console.WriteLine("The threshold was reached."); } }
References
https://docs.microsoft.com/en-us/dotnet/standard/events/
https://www.tutorialsteacher.com/csharp/csharp-event
public partial class FolderComponent : UserControl { public static readonly DependencyProperty FolderNameProperty = DependencyProperty.Register( nameof(FolderName), typeof(string), typeof(FolderComponent), new FrameworkPropertyMetadata( "", FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(OnFolderNameChanged), null), null); public FolderComponent() { InitializeComponent(); } public string FolderName { get { return (string) GetValue(FolderNameProperty); } set { SetValue(FolderNameProperty, value); } } private static void OnFolderNameChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FolderComponent uc = (FolderComponent) d; string oldValue = (string) e.OldValue; string newValue = (string) e.NewValue; uc.TextBlockFolderName.Text = newValue; } }
References
https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/custom-dependency-properties?view=netframeworkdesktop-4.8
https://stackoverflow.com/questions/17629945/how-to-create-a-bindable-property-in-wpf
https://stackoverflow.com/questions/29763254/what-is-the-proper-method-for-creating-a-bindable-property-on-a-user-control-in
A simple ItemsControl example
<Window x:Class="WpfTutorialSamples.ItemsControl.ItemsControlSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib" Title="ItemsControlSample" Height="150" Width="200"> <Grid Margin="10"> <ItemsControl> <system:String>ItemsControl Item #1</system:String> <system:String>ItemsControl Item #2</system:String> <system:String>ItemsControl Item #3</system:String> <system:String>ItemsControl Item #4</system:String> <system:String>ItemsControl Item #5</system:String> </ItemsControl> </Grid> </Window>
ItemsControl with data binding
<Window x:Class="WpfTutorialSamples.ItemsControl.ItemsControlDataBindingSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="ItemsControlDataBindingSample" Height="150" Width="300"> <Grid Margin="10"> <ItemsControl Name="icTodoList"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Margin="0,0,0,5"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="100" /> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Title}" /> <ProgressBar Grid.Column="1" Minimum="0" Maximum="100" Value="{Binding Completion}" /> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Grid> </Window>
using System; using System.Windows; using System.Collections.Generic; namespace WpfTutorialSamples.ItemsControl { public partial class ItemsControlDataBindingSample : Window { public ItemsControlDataBindingSample() { InitializeComponent(); List<TodoItem> items = new List<TodoItem>(); items.Add(new TodoItem() { Title = "Complete this WPF tutorial", Completion = 45 }); items.Add(new TodoItem() { Title = "Learn C#", Completion = 80 }); items.Add(new TodoItem() { Title = "Wash the car", Completion = 0 }); icTodoList.ItemsSource = items; } } public class TodoItem { public string Title { get; set; } public int Completion { get; set; } } }
The ItemsPanelTemplate property
<Window x:Class="WpfTutorialSamples.ItemsControl.ItemsControlPanelSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib" Title="ItemsControlPanelSample" Height="150" Width="250"> <Grid Margin="10"> <ItemsControl> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <WrapPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Button Content="{Binding}" Margin="0,0,5,5" /> </DataTemplate> </ItemsControl.ItemTemplate> <system:String>Item #1</system:String> <system:String>Item #2</system:String> <system:String>Item #3</system:String> <system:String>Item #4</system:String> <system:String>Item #5</system:String> </ItemsControl> </Grid> </Window>
ItemsControl with scrollbars
<Window x:Class="WpfTutorialSamples.ItemsControl.ItemsControlSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system="clr-namespace:System;assembly=mscorlib" Title="ItemsControlSample" Height="150" Width="200"> <Grid Margin="10"> <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> <ItemsControl> <system:String>ItemsControl Item #1</system:String> <system:String>ItemsControl Item #2</system:String> <system:String>ItemsControl Item #3</system:String> <system:String>ItemsControl Item #4</system:String> <system:String>ItemsControl Item #5</system:String> </ItemsControl> </ScrollViewer> </Grid> </Window>
References
https://www.wpf-tutorial.com/list-controls/itemscontrol/