Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

CSharp:WPF WPF Tips

From Aino Wiki

Jump to: navigation, search

Si propongono Tips che si implementano nel fronte Code Behind, la parte propriamente XAML è nella apposita sezione.

Interfaccia

Puntatore

Per visualizzare la clessidra, la mano o altro:

System.Windows.Input.Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait;
                                         // System.Windows.Input.Cursors.Hand;
System.Windows.Input.Mouse.OverrideCursor = null;

Clessidra

Usando il Dispatcher
esempio:

private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
	Dispatcher.Invoke((Action)(() =>
	{
		busyIndicatorDetails.IsBusy = true;
 
	}));
// ... etc ...
 
	Dispatcher.Invoke((Action)(() =>
	{
		busyIndicatorDetails.IsBusy = false;
 
	}));
}

Altro:

Application.Current.Dispatcher.Invoke(
                    new Action(() => IsBusy = true)
                        );

Controlli UI

Ricerche di controlli

Da un controllo custom padre è possibile cercare oggetti nei controlli figlio usando FindName:

// vAccTracking è l'istanza di un controllo con uno XAML
private AccTracking _vAccTracking;
public AccTracking vAccTracking
{
     get { return _vAccTracking; }
     set { _vAccTracking = value; }
}
 
//...
 
if (vAccTracking.FindName("RD_NEW") != null
	&& vAccTracking.FindName("RD_REAID") != null)
{
	RadioButton rbRD_NEW = (RadioButton)vAccTracking.FindName("RD_NEW");
	RadioButton rbRD_REAID = (RadioButton)vAccTracking.FindName("RD_REAID");
	rbRD_NEW.IsChecked = false;
	rbRD_REAID.IsChecked = false;
}
else
{
	log.Error("Controls 'RD_NEW' and\\or 'RD_REAID' NOT FOUND!");
}

Validazioni

Supponendo di voler togliere una validazione di tipo campo obbligatorio ad un controllo data datePicker, se nello XAML c'è:

<DatePicker Grid.Row="6" Grid.Column="4" 
		Name="dtRecallDueDate" 
		Margin="6,10,19,10" 
		Visibility="{Binding Path=FLG_status_Progress, Converter={StaticResource BooleanToVisibility} , ConverterParameter='1', 
		UpdateSourceTrigger='PropertyChanged'}" >
	<DatePicker.SelectedDate>
		<Binding Path="DT_NEXT_RECALL" 
				UpdateSourceTrigger="PropertyChanged" 
				Mode="TwoWay" 
				Converter='{StaticResource ShortDateConverter}' >
			<Binding.ValidationRules>
				<CustomerValidators:RequiredCustomerValidator 
						Controlname="{l:LocalizeByModule DefaultValue='Recall Due Date', 
						Key=dtRecallDueDate}">
					<CustomerValidators:RequiredCustomerValidator.CustomerType>
						<CustomerValidators:CustomerType 
							DataContext="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}" 
							CustomerTypeCode="{Binding IsDT_NEXT_RECALLRequired}" />
					</CustomerValidators:RequiredCustomerValidator.CustomerType>
					<CustomerValidators:RequiredCustomerValidator.ValidationParam>
						<CustomerValidators:Param 
							DataContext="{Binding Source={StaticResource DataContextBridge}, Path=DataContext}" 
							Key="DT_NEXT_RECALL" 
							Value="{Binding DT_NEXT_RECALL}" />
					</CustomerValidators:RequiredCustomerValidator.ValidationParam>
				</CustomerValidators:RequiredCustomerValidator>
			</Binding.ValidationRules>
		</Binding>
	</DatePicker.SelectedDate>
</DatePicker>

Da codice:

DatePicker dtRecallDueDate = (DatePicker)vAccTracking.FindName("dtRecallDueDate");
// ? Binding binding = BindingOperations.GetBinding(dtRecallDueDate, DatePicker.TextProperty);
Binding binding = BindingOperations.GetBinding(dtRecallDueDate, DatePicker.SelectedDateProperty);
binding.ValidationRules.Clear();

Visualizzazioni

Far apparire e nascondere

Nel caso di due icone indicanti uno stato, ecco un esempio come impostare la visualizzazione rendendo visibile o nascondendo oggetti UI:
XAML

<StackPanel Orientation="Horizontal" Margin="0,5,0,0">
	<StackPanel Orientation="Vertical">
		<Button Name="btnAccTracking" 
			Style="{StaticResource btnHyperlink}" Click="ShowDetailView" 
			CommandParameter="ACCTracking" Padding="1" Margin="20,0,0,0" 
			Content="{l:LocalizeByModule DefaultValue='ACC Tracking', Key=ACCTracking}" 
			Height="19" 
			BorderThickness="1,0"/>
		<Border Name="brdAccTracking" BorderThickness="1,0,1,1" 
			BorderBrush="#0096d7" Margin="20,0,0,0" 
			MaxWidth="120" Visibility="Collapsed"/>
	</StackPanel>
	<Image Name="icoGreen" 
		Source="/FOX.Themes;component/Images/ELEMENTS/ico-statusgreen-10.png" 
		Visibility="{Binding Path='FLG_status_Completed', Converter={StaticResource BooleanToVisibility} , 
		ConverterParameter='1', UpdateSourceTrigger='PropertyChanged'}" 
		Margin="10,0,0,0" />
	<Image Name="icoRed" 
		Source="/FOX.Themes;component/Images/ELEMENTS/ico-statusred-10.png" 
		Visibility="{Binding Path='FLG_status_Progress', Converter={StaticResource BooleanToVisibility} , 
		ConverterParameter='1', UpdateSourceTrigger='PropertyChanged'}" 
		Margin="10,0,0,0"/>
</StackPanel>

Codice C# associato:

icoRed.Visibility = System.Windows.Visibility.Visible;
icoGreen.Visibility = System.Windows.Visibility.Collapsed;

Ordine proprietà Margin

I parametri sono assegnati in senso orario partendo da SINISTRA.
Esempio: XAML

<RadioButton Margin="1,2,3,4" Visibility="Visible"></RadioButton>

Effetto:
1 = Left,
2 = Top,
3 = Right,
4 = Bottom

Varie

Windows Form

E' possibile integrare in un progetto WPF alcuni controlli presenti nelle Windows Form ciò perché alcuni di questi ultimi non sono stati riscritti e quindi integrati come controlli originari per WPF.

FolderBrowserDialog

Questo controllo consente di selezionare un percorso sul File system mediante l'ausilio di una finestra che consente di navigarci e selezionare un percorso da riportare ad es in una TextBox. (Finestra di dialogo per selezionare una directory esistente)
E' una libreria esterna quindi come prima cosa occorre aggiungere la Reference nel progetto WPF, la libreria si chiama: System.Windows.Form.
Infine occorre integrare il riferimento nella classe in cui serve la finestra di dialogo mediante una Using, si potrà adottare la forma compatta:

using WinForms = System.Windows.Forms;

Ogni risorsa della libreria sarà accessibile con: WinForms.Risorsa

Esempio

using WinForms = System.Windows.Forms;
 
namespace SimplyFileBackup
{
    public partial class MainWindow : Window
    {
        public WinForms.FolderBrowserDialog m_folderBrowserDialog = new WinForms.FolderBrowserDialog();
 
        // Apertura della finestra !!!
        private void BtnSelect_SourcePath_Click(object sender, RoutedEventArgs e)
        {
            m_folderBrowserDialog.SelectedPath = TxtSourcePath.Text.Trim();
            WinForms.DialogResult result = m_folderBrowserDialog.ShowDialog();
            if (result == WinForms.DialogResult.OK)
            {
                TxtSourcePath.Text = m_folderBrowserDialog.SelectedPath;
            }
        }
 
    }
}

Oggetti

Conversioni

ObservableCollection

Sono liste usate nelle viste che a differenza di quelle tradizionali (List<T>) ogni modifica intervenuta su i suoi items fa scattare eventi di aggiornamento sulla UI (User Interface).

private ObservableCollection<MaintenanceListModel> _MaintenanceList = 
                                                   new ObservableCollection<MaintenanceListModel>();
public ObservableCollection<MaintenanceListModel> MaintenanceList
{
	get { return _MaintenanceList; }
	set
	{
		_MaintenanceList = value;
		OnPropertyChanged("MaintenanceList");
	}
}
// ------------
List<MaintenanceListModel> mnts = new List<MaintenanceListModel>();
// etc
MaintenanceList = new ObservableCollection<MaintenanceListModel>(mnts.OrderByDescending(x => x.PurchaseDate));

Mappa e Link


C# | WPF | WPF Soluzioni varie


Visual Studio


Parole chiave: Folder Browser dialog

Author