From ec19eb015104718b8efaa30dcb0b72d6fae01726 Mon Sep 17 00:00:00 2001 From: soukoku Date: Tue, 8 Apr 2014 07:36:28 -0400 Subject: [PATCH] Cleaned up wpf sample with some view models. --- Spec/CapOrderForWeb.PDF | Bin 62314 -> 0 bytes Tests/Tester.WPF/App.xaml | 18 ++ Tests/Tester.WPF/CapVM.cs | 33 +++ Tests/Tester.WPF/DSVM.cs | 20 ++ Tests/Tester.WPF/MainWindow.xaml | 29 +- Tests/Tester.WPF/MainWindow.xaml.cs | 442 ++++++++++++---------------- Tests/Tester.WPF/Tester.WPF.csproj | 3 + Tests/Tester.WPF/TwainVM.cs | 96 ++++++ 8 files changed, 378 insertions(+), 263 deletions(-) delete mode 100644 Spec/CapOrderForWeb.PDF create mode 100644 Tests/Tester.WPF/CapVM.cs create mode 100644 Tests/Tester.WPF/DSVM.cs create mode 100644 Tests/Tester.WPF/TwainVM.cs diff --git a/Spec/CapOrderForWeb.PDF b/Spec/CapOrderForWeb.PDF deleted file mode 100644 index 5c050228b95dd8e2ffefb3b19b0dcea154d7d1d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62314 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�gjc1SVho9gEs6>fC1;y=uyB#*#76JG$g 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 diff --git a/Tests/Tester.WPF/App.xaml b/Tests/Tester.WPF/App.xaml index ec78fb5..d733b8c 100644 --- a/Tests/Tester.WPF/App.xaml +++ b/Tests/Tester.WPF/App.xaml @@ -14,6 +14,24 @@ + diff --git a/Tests/Tester.WPF/CapVM.cs b/Tests/Tester.WPF/CapVM.cs new file mode 100644 index 0000000..ea5bae9 --- /dev/null +++ b/Tests/Tester.WPF/CapVM.cs @@ -0,0 +1,33 @@ +using NTwain.Values; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Tester.WPF +{ + /// + /// Wraps a capability as a view model. + /// + class CapVM + { + public CapabilityId Cap { get; set; } + + public string Name + { + get + { + if (Cap > CapabilityId.CustomBase) + { + return "[Custom] " + ((int)Cap - (int)CapabilityId.CustomBase); + } + return Cap.ToString(); + } + } + + public override string ToString() + { + return Name; + } + } +} diff --git a/Tests/Tester.WPF/DSVM.cs b/Tests/Tester.WPF/DSVM.cs new file mode 100644 index 0000000..3cc74d0 --- /dev/null +++ b/Tests/Tester.WPF/DSVM.cs @@ -0,0 +1,20 @@ +using NTwain.Data; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Tester.WPF +{ + /// + /// Wraps a data source as view model. + /// + class DSVM + { + public TWIdentity DS { get; set; } + + public string Name { get { return DS.ProductName; } } + public string Version { get { return DS.Version.Info; } } + public string Protocol { get { return string.Format("{0}.{1}", DS.ProtocolMajor, DS.ProtocolMinor); } } + } +} diff --git a/Tests/Tester.WPF/MainWindow.xaml b/Tests/Tester.WPF/MainWindow.xaml index f36004f..b848397 100644 --- a/Tests/Tester.WPF/MainWindow.xaml +++ b/Tests/Tester.WPF/MainWindow.xaml @@ -2,7 +2,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:modern="http://modernwpf" - Title="TWAIN Tester" Height="600" Width="900" ResizeMode="CanResizeWithGrip" + Title="TWAIN DS Tester" Height="600" Width="900" ResizeMode="CanResizeWithGrip" + modern:Chrome.ShowCaptionIcon="False" Style="{StaticResource AppWindow}"> @@ -17,22 +18,29 @@ - + - + + + + + - + - + @@ -41,8 +49,9 @@ - + diff --git a/Tests/Tester.WPF/MainWindow.xaml.cs b/Tests/Tester.WPF/MainWindow.xaml.cs index 84b2204..1bcee9a 100644 --- a/Tests/Tester.WPF/MainWindow.xaml.cs +++ b/Tests/Tester.WPF/MainWindow.xaml.cs @@ -28,7 +28,8 @@ namespace Tester.WPF /// public partial class MainWindow : Window { - TwainSessionWPF twain; + TwainVM _twainVM; + public MainWindow() { InitializeComponent(); @@ -41,14 +42,19 @@ namespace Tester.WPF Title = Title + " (32bit)"; } - SetupTwain(); + _twainVM = new TwainVM(); + _twainVM.SourceDisabled += delegate + { + ModernMessageBox.Show(this, "Success!"); + }; + this.DataContext = _twainVM; } protected override void OnClosed(EventArgs e) { - if (twain.State == 4) + if (_twainVM.State == 4) { - twain.CloseSource(); + _twainVM.CloseSource(); } base.OnClosed(e); } @@ -58,89 +64,38 @@ namespace Tester.WPF base.OnSourceInitialized(e); var hwnd = new WindowInteropHelper(this).Handle; - HwndSource.FromHwnd(hwnd).AddHook(twain.PreFilterMessage); - var rc = twain.OpenManager(hwnd); + // this line is unnecessary if using twain 2 dsm but doesn't hurt to use it + HwndSource.FromHwnd(hwnd).AddHook(_twainVM.PreFilterMessage); + + var rc = _twainVM.OpenManager(hwnd); if (rc == ReturnCode.Success) { - SrcList.ItemsSource = twain.GetSources(); + SrcList.ItemsSource = _twainVM.GetSources().Select(s => new DSVM { DS = s }); } } - - private void SetupTwain() - { - TWIdentity appId = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetEntryAssembly()); - twain = new TwainSessionWPF(appId); - twain.DataTransferred += (s, e) => - { - if (e.Data != IntPtr.Zero) - { - ImageDisplay.Source = e.Data.GetWPFBitmap(); - } - else if (!string.IsNullOrEmpty(e.FilePath)) - { - var img = new BitmapImage(new Uri(e.FilePath)); - ImageDisplay.Source = img; - } - }; - - twain.SourceDisabled += delegate - { - ModernMessageBox.Show(this, "Success!"); - }; - twain.TransferReady += (s, te) => - { - if (twain.GetCurrentCap(CapabilityId.ICapXferMech) == XferMech.File) - { - var formats = twain.CapGetImageFileFormat(); - var wantFormat = formats.Contains(FileFormat.Tiff) ? FileFormat.Tiff : FileFormat.Bmp; - - var fileSetup = new TWSetupFileXfer - { - Format = wantFormat, - FileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.tif") - }; - var rc = twain.DGControl.SetupFileXfer.Set(fileSetup); - } - }; - this.DataContext = twain; - } - private void Button_Click_1(object sender, RoutedEventArgs e) { - if (twain.State == 4) - { - if (twain.CapGetPixelTypes().Contains(PixelType.BlackWhite)) - { - twain.CapSetPixelType(PixelType.BlackWhite); - } - - if (twain.CapGetImageXferMechs().Contains(XferMech.File)) - { - twain.CapSetImageXferMech(XferMech.File); - } - - var rc = twain.EnableSource(SourceEnableMode.NoUI, false, new WindowInteropHelper(this).Handle, SynchronizationContext.Current); - } + _twainVM.TestCapture(new WindowInteropHelper(this).Handle); } private void SrcList_SelectionChanged(object sender, SelectionChangedEventArgs e) { - if (twain.State == 4) + if (_twainVM.State == 4) { - twain.CloseSource(); + _twainVM.CloseSource(); } - var dsId = SrcList.SelectedItem as TWIdentity; + var dsId = SrcList.SelectedItem as DSVM; if (dsId != null) { - var rc = twain.OpenSource(dsId.ProductName); + var rc = _twainVM.OpenSource(dsId.Name); //rc = DGControl.Status.Get(dsId, ref stat); if (rc == ReturnCode.Success) { - var caps = twain.SupportedCaps.Select(o => new CapVM + var caps = _twainVM.SupportedCaps.Select(o => new CapVM { - Id = o + Cap = o }).OrderBy(o => o.Name).ToList(); CapList.ItemsSource = caps; } @@ -151,534 +106,515 @@ namespace Tester.WPF } } - class CapVM - { - public CapabilityId Id { get; set; } - public string Name - { - get - { - if (Id > CapabilityId.CustomBase) - { - return "[Custom] " + ((int)Id - (int)CapabilityId.CustomBase); - } - return Id.ToString(); - } - } - public override string ToString() - { - return Name; - } - } private void CapList_SelectionChanged(object sender, SelectionChangedEventArgs e) { var capVM = CapList.SelectedItem as CapVM; if (capVM != null) { - var cap = capVM.Id; + var cap = capVM.Cap; switch (cap) { case CapabilityId.ACapXferMech: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapAlarms: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapAlarmVolume: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapAuthor: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapAutoFeed: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapAutomaticCapture: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapAutomaticSenseMedium: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapAutoScan: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapBatteryMinutes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapBatteryPercentage: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapCameraEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapCameraOrder: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapCameraPreviewUI: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapCameraSide: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapCaption: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapClearBuffers: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapClearPage: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapCustomDSData: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapCustomInterfaceGuid: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapDeviceEvent: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDeviceOnline: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDeviceTimeDate: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDoubleFeedDetection: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDoubleFeedDetectionLength: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDoubleFeedDetectionResponse: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDoubleFeedDetectionSensitivity: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDuplex: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapDuplexEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapEnableDSUIOnly: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapEndorser: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapExtendedCaps: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederAlignment: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederLoaded: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederOrder: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederPocket: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeederPrep: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapFeedPage: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapIndicators: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapIndicatorsMode: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapJobControl: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapLanguage: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapMaxBatchBuffers: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapMicrEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPaperDetectable: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPaperHandling: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPowerSaveTime: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPowerSupply: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinter: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterCharRotation: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterFontStyle: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndex: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndexLeadChar: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndexMaxValue: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndexNumDigits: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndexStep: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterIndexTrigger: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapPrinterMode: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapPrinterString: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; //case CapabilityId.CapPrinterStringPreview: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; //case CapabilityId.CapPrinterSuffix: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapPrinterVerticalOffset: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapReacquireAllowed: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapRewindPage: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapSegmented: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.CapSerialNumber: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; //case CapabilityId.CapSupportedCaps: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.CapSupportedCapsSegmentUnique: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapSupportedDATs: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapThumbnailsEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapTimeBeforeFirstCapture: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapTimeBetweenCaptures: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapTimeDate: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapUIControllable: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.CapXferCount: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); // spec says ushort but who knows + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // spec says ushort but who knows break; case CapabilityId.CustomBase: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutoBright: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutoDiscardBlankPages: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticBorderDetection: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticColorEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticColorNonColorPixelType: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticCropUsesFrame: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticDeskew: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticLengthDetection: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutomaticRotate: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapAutoSize: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeDetectionEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeMaxRetries: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeMaxSearchPriorities: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeSearchMode: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeSearchPriorities: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBarcodeTimeout: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBitDepth: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBitDepthReduction: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBitOrder: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBitOrderCodes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapBrightness: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapCCITTKFactor: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapColorManagementEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapCompression: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapContrast: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapCustHalftone: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapExposureTime: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapExtImageInfo: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFeederType: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFilmType: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFilter: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFlashUsed: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFlashUsed2: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapFlipRotation: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; //case CapabilityId.ICapFrames: - // CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + // CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); // break; case CapabilityId.ICapGamma: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapHalftones: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapHighlight: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapICCProfile: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapImageDataset: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapImageFileFormat: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapImageFilter: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapImageMerge: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapImageMergeHeightThreshold: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapJpegPixelType: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapJpegQuality: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapJpegSubSampling: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapLampState: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapLightPath: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapLightSource: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapMaxFrames: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapMinimumHeight: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapMinimumWidth: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapMirror: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapNoiseFilter: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapOrientation: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapOverScan: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeDetectionEnabled: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeMaxRetries: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeMaxSearchPriorities: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeSearchMode: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeSearchPriorities: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPatchCodeTimeout: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; // TODO phys size are twfix32 case CapabilityId.ICapPhysicalHeight: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPhysicalWidth: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPixelFlavor: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPixelFlavorCodes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPixelType: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapPlanarChunky: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapRotation: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapShadow: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapSupportedBarcodeTypes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapSupportedExtImageInfo: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapSupportedPatchCodeTypes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapSupportedSizes: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapThreshold: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapTiles: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapTimeFill: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapUndefinedImageSize: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapUnits: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapXferMech: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapXNativeResolution: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapXResolution: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapXScaling: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapYNativeResolution: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapYResolution: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapYScaling: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; case CapabilityId.ICapZoomFactor: - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); break; default: if (cap > CapabilityId.CustomBase) { - CapDetailList.ItemsSource = twain.GetCapabilityValues(cap, true); + CapDetailList.ItemsSource = _twainVM.GetCapabilityValues(cap, true); } else { diff --git a/Tests/Tester.WPF/Tester.WPF.csproj b/Tests/Tester.WPF/Tester.WPF.csproj index 56dc035..4daa138 100644 --- a/Tests/Tester.WPF/Tester.WPF.csproj +++ b/Tests/Tester.WPF/Tester.WPF.csproj @@ -68,6 +68,7 @@ MSBuild:Compile Designer + MSBuild:Compile Designer @@ -76,6 +77,8 @@ App.xaml Code + + MainWindow.xaml Code diff --git a/Tests/Tester.WPF/TwainVM.cs b/Tests/Tester.WPF/TwainVM.cs new file mode 100644 index 0000000..529d86b --- /dev/null +++ b/Tests/Tester.WPF/TwainVM.cs @@ -0,0 +1,96 @@ +using NTwain; +using NTwain.Data; +using NTwain.Values; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using CommonWin32; +using System.Threading; + +namespace Tester.WPF +{ + /// + /// Wraps the twain session as a view model for databinding. + /// + class TwainVM : TwainSessionWPF + { + public TwainVM() + : base(TWIdentity.CreateFromAssembly(DataGroups.Image | DataGroups.Audio, Assembly.GetEntryAssembly())) + { + + } + + private ImageSource _image; + + /// + /// Gets or sets the captured image. + /// + /// + /// The image. + /// + public ImageSource Image + { + get { return _image; } + set + { + _image = value; + RaisePropertyChanged("Image"); + } + } + + protected override void OnTransferReady(TransferReadyEventArgs e) + { + // set it up to use file xfer + + if (this.GetCurrentCap(CapabilityId.ICapXferMech) == XferMech.File) + { + var formats = this.CapGetImageFileFormat(); + var wantFormat = formats.Contains(FileFormat.Tiff) ? FileFormat.Tiff : FileFormat.Bmp; + + var fileSetup = new TWSetupFileXfer + { + Format = wantFormat, + FileName = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.tif") + }; + var rc = this.DGControl.SetupFileXfer.Set(fileSetup); + } + base.OnTransferReady(e); + } + + protected override void OnDataTransferred(DataTransferredEventArgs e) + { + if (e.Data != IntPtr.Zero) + { + Image = e.Data.GetWPFBitmap(); + } + else if (!string.IsNullOrEmpty(e.FilePath)) + { + var img = new BitmapImage(new Uri(e.FilePath)); + Image = img; + } + base.OnDataTransferred(e); + } + + public void TestCapture(IntPtr hwnd) + { + if (State == 4) + { + if (this.CapGetPixelTypes().Contains(PixelType.BlackWhite)) + { + this.CapSetPixelType(PixelType.BlackWhite); + } + + if (this.CapGetImageXferMechs().Contains(XferMech.File)) + { + this.CapSetImageXferMech(XferMech.File); + } + + var rc = EnableSource(SourceEnableMode.NoUI, false, hwnd, SynchronizationContext.Current); + } + } + } +}