2014-02-12 57 views
0

這是我第一次嘗試使用WPF構建C#應用程序;我以前一直使用Windows Forms。我正在遇到一個似乎是一個簡單任務的錯誤。當試圖執行按鈕的.IsEnabled屬性的以下分配時,PresentationFramework.dll中會發生異常System.Reflection.TargetIncovationException。當我按Break時,我只是得到Source Not Available窗口,而選項ti查看反彙編信息。btnExample.IsEnabled賦值拋出WPF中的異常

private void txtFileLoc_TextChanged(object sender, TextChangedEventArgs e) { 
    if (txtFileLoc.Text.EndsWith(".txt")) 
     btnExecute.IsEnabled = true; 
    else 
     btnExecute.IsEnabled = false; 
} 

我已經驗證它是通過將它們替換爲Console.WriteLine來進行調試來引發異常。

編輯:按照要求,這裏是程序XAML & CS

<Window x:Name="winMain" x:Class="IP_Extractor_2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="IP Extractor" Height="250" Width="410" ResizeMode="CanMinimize" Background="#FFECEFF4"> 
    <Grid x:Name="grdMain"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="39*"/> 
      <RowDefinition Height="161*"/> 
      <RowDefinition Height="21*"/> 
     </Grid.RowDefinitions> 
     <ProgressBar x:Name="prgProgress" Margin="0,0,0,0" Grid.Row="2" VerticalAlignment="Bottom" Height="17" Foreground="#FF7A6BA6" Value="50"/> 
     <TextBox x:Name="txtFileLoc" HorizontalAlignment="Left" Height="20" Margin="10,10,0,0" Text="Browse for a Text File" VerticalAlignment="Top" Width="290" TextChanged="txtFileLoc_TextChanged"/> 
     <Button x:Name="btnBrowse" Content="Browse" HorizontalAlignment="Left" Margin="305,10,0,0" VerticalAlignment="Top" Width="52" Height="20" Click="btnBrowse_Click"/> 
     <Button x:Name="btnExecute" Content="Go" HorizontalAlignment="Left" Margin="362,10,0,0" VerticalAlignment="Top" Width="22" Height="20" Click="btnExecute_Click" IsEnabled="False"/> 
     <ListBox x:Name="lboResults" HorizontalAlignment="Left" Height="151" Margin="10,0,0,0" Grid.Row="1" VerticalAlignment="Top" Width="374"/> 
    </Grid> 
</Window> 

CODE:

using Microsoft.Win32; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace IP_Extractor_2 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     OpenFileDialog openFileDialog1; 

     public MainWindow() { 
      InitializeComponent(); 
     } 

     private void btnBrowse_Click(object sender, RoutedEventArgs e) { 
      // Create an instance of the open file dialog box. 
      openFileDialog1 = new OpenFileDialog(); 

      // Set filter options and filter index. 
      openFileDialog1.Filter = "Text Files (.txt)|*.txt"; 
      openFileDialog1.FilterIndex = 1; 
      openFileDialog1.Multiselect = false; 

      // Call the ShowDialog method to show the dialog box. 
      bool? userClickedOK = openFileDialog1.ShowDialog(); 

      // Process input if the user clicked OK. 
      if (userClickedOK == true) 
       txtFileLoc.Text = openFileDialog1.FileName; 
     } 

     private void txtFileLoc_TextChanged(object sender, TextChangedEventArgs e) { 
      if (txtFileLoc.Text.EndsWith(".txt")) 
       btnExecute.IsEnabled = true; 
      else 
       btnExecute.IsEnabled = false; 
     } 
    } 
} 
+0

你在使用ui線程嗎? –

+2

什麼是InnerException和堆棧跟蹤? – SLaks

+0

創建一個最小自包含程序來重現此問題,並將其發佈。應該可能少於50行cs + xaml。因爲這不應該發生,並且有些事情你沒有發佈。 –

回答

0

檢查設置,看看有沒有改變以前的事情空/空字符串。

if (btnExecute != null) 
{ 
    btnExecute.IsEnabled = ((txtFileLoc != null) && 
          (string.IsNullOrEmpty(txtFileLoc.Text) == false) && 
          (txtFileLoc.Text.ToLower().EndsWith(".txt"))); 
} 

編輯

雖然作品背後的代碼,可能是做這件事的有效途徑,它不是標準的方式。 WPF是關於綁定和INotifyProperty更改相關的事件。

我有我的按鍵綁定到視圖模型布爾這將是對頁面的數據上下文(這將通過按鈕來繼承),並結合諸如

<Button IsEnabled="{Binding IsExecuteButtonOperational }"/> 

我建議你開始考慮MVVM編程範例(將其視爲分離業務邏輯表單視圖邏輯關注點的方式)。我在我的博客Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding.上提供了一個例子,可以幫助您開始。

+0

不幸的是,拋出了同樣的異常。 – Rawrcasm

+0

@Rawrcasm我逐字創建了你的代碼並且遇到了兩個錯誤。首先,當btnExecute尚未準備就緒時,它在初始化期間觸發,因此我添加了if檢查。其次是當一個文件有TXT或Txt命名時,所以我放入了ToLower。試試上面的代碼,它適用於我。 – OmegaMan

+0

@Rawrcasm我的意思是說,在準備好您的回覆後,我的代碼段運行,我_then_創建。所以上面的代碼是新的。 – OmegaMan