(We are using .NET)
I used WPF and the MVVM pattern for the UI; and I used the MVVM Light Toolkit to help with MVVM development.
I used the X509Certificate2UI.SelectFromCollection() method to show a dialog for the user to select a certificate (X509Certificate2UI is in the System.Security.Cryptography.X509Certificates namespace, System.Security.dll assembly)
X509CertificateCollection certificateCollection = X509Certificate2UI.SelectFromCollection(
store.Certificates, "Caption", "Message",
X509SelectionFlag.SingleSelection);
My problem was the dialog that X509Certificate2UI.SelectFromCollection() is not modal and it does not close when I close the main window.
The solution was to use the overloaded method of X509Certificate2UI.SelectFromCollection() which accepts a handle to the parent window.
WindowInteropHelper windowHwnd =new WindowInteropHelper(this);
IntPtr hWnd = windowHwnd.Handle;
X509CertificateCollection certificateCollection = X509Certificate2UI.SelectFromCollection(
store.Certificates, "Caption", "Message",
X509SelectionFlag.SingleSelection, hWnd);
[To know more about Win32 Handles go to "Win32 Handle (HWND) & WPF Objects - A Note" - http://www.abhisheksur.com/2010/12/win32-handle-hwnd-wpf-objects-note.html ...]
But there was another problem: Because I was using MVVM with WPF I have to put this logic inside my ViewModel. But ViewModel does not have direct acces to the Window element!
The solution was to pass the Window object as parameter to a Command object as shown below
[The View - XAML]
<Window ... Name="TheMainWindow"
DataContext="{Binding Main, Source={StaticResource Locator}}">
<Button Command="{Binding SelectCertificateCommand}" CommandParameter="{Binding ElementName=TheMainWindow}" Content="Select Certificate From the Store" />
</Window>
[The ViewModel]
[ViewModelBase and RelayCommand are from the MVVM Light Toolkit]
public class MainViewModel : ViewModelBase
{
private X509Certificate2 _selectedCertificate;
public ICommand SelectCertificateCommand { get; private set; }
public MainViewModel()
{
this.SelectCertificateCommand = new RelayCommand(
(window) =>
{
X509Certificate2 cert = PickCertificate(StoreLocation.CurrentUser, StoreName.My, window);
if (cert != null)
{
this.Certificate = cert;
}
});
}
public X509Certificate2 Certificate
{
get { return _selectedCertificate; }
set
{
if (_selectedCertificate == value) { return; }
_selectedCertificate = value;
RaisePropertyChanged(() => Certificate);
}
}
private static X509Certificate2 PickCertificate(StoreLocation location, StoreName name, Window window)
{
X509Store store = new X509Store(name, location);
try
{
store.Open(OpenFlags.ReadOnly);
// pick a certificate from the store
X509Certificate2 certificate = null;
X509CertificateCollection certificateCollection = X509Certificate2UI.SelectFromCollection(
store.Certificates, "Select a certificate", "Select a certificate",
X509SelectionFlag.SingleSelection, new WindowInteropHelper(window).Handle);
if (certificateCollection.Count > 0)
{
certificate = (X509Certificate2)certificateCollection[0];
}
return certificate;
}
finally
{
store.Close();
}
}
}
Free Lessons for Chruch Pianists:
Free lessons, tips and downloads for church pianists
DVD Courses (Reharmonization, Play by Ear!, Arranging, Accompanying, Theory for Church Pianists, etc.):
Over 30 hours of DVD instruction for church pianists
No comments:
Post a Comment