問題タブ [system.componentmodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winforms - Inherited Control Visible/Enabled プロパティ値 常に True: PropertyGrid
カスタム WinForms ホスティング環境を作成しました。ツールボックスと PropertyGrid があります。
ツールボックスに表示されるコントロールは、既存の WinForm コントロールから継承されます。
ドロップダウン リスト ソース:
ICustomTypeDescriptor
に表示したくないプロパティを除外するために実装しましたPropertyGrid
。
問題:
クラスから継承されたEnabled
&プロパティの値をシリアル化する際に問題に直面しています。Visible
System.Windows.Forms.Control
WriteProperties メソッド ( BasicDesignerLoader
):
問題 # 1: &プロパティのShouldSerializeValue
メソッドが常に false を返す。Enabled
Visible
問題 2:ShouldSerializeValue
メソッド チェックをスキップしてもGetValue
、PropertyDescriptor
常に return のメソッドをチェックしますTrue
。
現在の回避策: 回避策
として、現在Enabled
&Visible
プロパティを を使用して非表示にし、BrowsableAttribute
他の 2 つのブール型プロパティを作成し、 を使用しDisplayNameAttribute
て表示名をEnable
&に変更しましVisible
た。
しかし、この回避策では、これらのスニペットをすべてのコントロールに書き込む必要があります。
私は何かを見逃していますか、何か間違っていますか?Enabled
&Visible
プロパティが変更されないのはなぜですか?
c# - フォーム コントロールの列挙
Form インスタンスのコントロールを列挙する次の C# コードがあります。
これは、TextBox 内のフォーム form2 のすべてのコントロール名を一覧表示します。これは、PowerShell でこのコードを再現しようとする私の試みです。
しかし、これはうまくいきません。$form.Control が空になったように見えるため、foreach ループに入ることはありません。上記の C# コードを PowerShell で動作させるにはどうすればよいですか?
[編集1]
上記のコードには、明らかにコントロールのないフォームがあります。Controls コレクションに Button が追加されたフォームを使用して更新された PowerShell コードを次に示しますが、(一見) Controls コレクションを列挙しないという同じ結果になります。
[編集2]
$property タイプをチェックすると:
GetType() は次を返します。
System.ComponentModel.PropertyDescriptorCollection
PropertyDescriptor を期待していた場所。
.net - エクスポート属性がそのタイプに適用されているかのように、MEFでタイプをエクスポートするにはどうすればよいですか?
コンパイル時に型にExport属性が適用されているのとまったく同じように、実行時にMEFExport属性を型に動的に適用したいと思います。
これを行う簡単な方法はありますか?
それを除けば、これを行うための複雑な方法はありますか?
c# - AggregateCatalogとは何ですか?
何AggregateCatalog
ですか?を構築するとき、それはどういう意味new AggregateCatalog()
ですか?カタログにアセンブリを追加するとはどういう意味catalog.Catalogs.Add(new AssemblyCatalog(someAssembly))
ですか?アセンブリ以外に、カタログに何を追加できますか?これに関連する一般的な知識も役に立ちます(私は完全な初心者です)
c# - System.ComponentModel.Win32Exceptionを与えるWindowsアプリケーションからWindowsサービスを開始しようとしています:アクセスが拒否されました
2 つの特定のサービスの状態を開始/停止および監視する Windows アプリケーションを開発しようとしています。
問題は私が得ていることです
System.ComponentModel.Win32Exception: アクセスが拒否されました
両方のサービスがローカル システムであることに注意してください
以下は私のコードです
c# - クラス System.ComponentModel.Container をいつ、なぜ使用する必要があるのでしょうか?
いつ、なぜ を使用すべきか説明できる人はいSystem.ComponentModel.Container
ますか? 最近、このクラスhereの使用に出会いましたが、このクラスがどのような利点をもたらすのか本当に理解できません。
c# - Component.GetService() を理解する
私はこのコードでUsercontrolにメソッドを持っています
このメソッドを、Visual Studio とアプリケーションの間の仲介者として機能する「プロキシ」クラスに移動したいと考えています。問題は、GetService がコントロール内で呼び出された場合にのみ、アクティブなドキュメントを正しく返すことです。そのメソッドを Proxy クラスに移動すると、GetService に定義がありません。このメソッドは ComponentModel.Component から来ていると検索したので、Proxy クラスを Component から派生させました。すべてが正常にコンパイルされますが、常にアクティブなドキュメントを要求すると例外が発生します。GetService() メソッドの仕組みがよくわかりません。これを手伝ってください。
.net - .NET: 特定のスレッドでデリゲートを呼び出すにはどうすればよいですか? (ISynchronizeInvoke、Dispatcher、AsyncOperation、SynchronizationContext など)
まず、この質問にはwinformsやwpfなどの GUI 固有のタグが付けられていないことに注意してください。すぐにわかるように、これは意図的なものです。
第二に、この質問がやや長い場合は申し訳ありません。あちこちに散らばっているさまざまな情報を集めて、価値のある情報を提供するようにしています。ただし、私の質問は「知りたいこと」のすぐ下にあります。
私は最終的に、特定のスレッドでデリゲートを呼び出すために .NET によって提供されるさまざまな方法を理解することを使命としています。
私が知りたいこと:
特定のスレッドでデリゲートを呼び出すための最も一般的な方法 (Winforms または WPF 固有ではない) を探しています。
または、別の言い方をすると、これを行うためのさまざまな方法 (WPF
Dispatcher
を使用するなど) が相互に利用されているかどうか、およびその方法に興味があります。つまり、クロススレッド デリゲート呼び出しに共通のメカニズムが 1 つあり、それが他のすべてのメカニズムで使用されている場合です。
私がすでに知っていること:
このトピックに関連する多くのクラスがあります。その中で:
SynchronizationContext
(中System.Threading
)
私が推測しなければならないとしたら、それは最も基本的なものでしょう。正確に何をするのか、どのように使用されるのかはわかりませんが。AsyncOperation
& (in ) これらは のラッパーのようです。それらを使用する方法の手がかりはありません。AsyncOperationManager
System.ComponentModel
SynchronizationContext
WindowsFormsSynchronizationContext
(中System.Windows.Forms
)
のサブクラスSynchronizationContext
。ISynchronizeInvoke
(中System.ComponentModel
)
Windows フォームで使用されます。(Control
クラスはこれを実装しています。推測する必要がある場合、この実装は を利用していると思いますWindowsFormsSynchronizationContext
。)Dispatcher
& (in ) 後者は の別のサブクラスのようで、前者はそれに委譲されています。DispatcherSynchronizationContext
System.Windows.Threading
SynchronizationContext
一部のスレッドには、メッセージ キューと共に独自のメッセージ ループがあります。
(MSDN のページAbout Messages and Message Queuesには、メッセージ ループがシステム レベルでどのように機能するか、つまり Windows API としてのメッセージ キューに関する入門的な背景情報があります。)
メッセージ キューを使用してスレッドのクロススレッド呼び出しを実装する方法がわかります。
PostThreadMessage
Windows API を使用すると、デリゲートを呼び出す命令を含む特定のスレッドのメッセージ キューにメッセージを入れることができます。そのスレッドで実行されるメッセージ ループは最終的にそのメッセージに到達し、デリゲートが呼び出されます。MSDN で読んだことから、スレッドは自動的に独自のメッセージ キューを持ちません。メッセージキューは、スレッドがウィンドウを作成したときなどに利用可能になります。メッセージ キューがなければ、スレッドにメッセージ ループがあっても意味がありません。
では、ターゲット スレッドにメッセージ ループがない場合、クロススレッド デリゲート呼び出しはまったく可能でしょうか? たとえば、.NET コンソール アプリケーションではどうでしょうか。(この質問への回答から判断すると、コンソールアプリでは確かに不可能だと思います。)
compact-framework - Compact Framework で Forms.Timer を破棄する方法
Compact Framework では、System.Windows.Forms.Timer クラスは system.componentmodel コンストラクターをサポートしていません。
新しい Timer() がサポートされています: http://msdn.microsoft.com/en-us/library/aa335543(v=vs.71).aspx
新しいタイマー (IContainer コンテナー) はサポートされていません: http://msdn.microsoft.com/en-us/library/aa335544(v=vs.71).aspx
これは、CF アプリのフォームにタイマーを追加しても、フォームの IContainer コンポーネント フィールドに追加されないため、フォームが dispose()d のときに auto-dispose()d を取得しないことを意味します。
これがサポートされていないのはなぜですか?
フォームが破棄されたときにタイマーを破棄するにはどうすればよいですか? 私には2つの主なオプションがあるようです:
- フォームの dispose() メソッドを .designer.cs からメインの .cs ファイルに移動し、そこに手動の「_timer.dispose()」呼び出しを追加します
- または、InitializeComponent() が呼び出された後、フォームの作成時に Timer オブジェクトをコンポーネント コレクションに手動で追加します。
どちらを優先する必要がありますか? これら 2 つのうちの 1 つを忘れると、Timer は永遠に存続し、フォームを存続させます (Timer は GC できず、フォームの Timer_Tick() メソッドへの参照を保持しているため、フォームは GC されません)。 )。
この実装の決定は、注意する必要がある CF マシンでのタイマーとディスポに関する奇妙さを反映していますか?
c# - プロパティ名を取得するためのLinq式と拡張メソッド
POCOプロパティ間でデータバインディングを行う簡単な方法を説明するこの投稿を見ていました:データバインディングPOCOプロパティ
Bevanによるコメントの1つには、このようなデータバインディングを実現するために使用できる単純なBinderクラスが含まれていました。それは私が必要とするものにはうまく機能しますが、クラスを改善するためにBevanが行った提案のいくつかを実装したいと思います。
- ソースとターゲットが割り当てられていることを確認する
- sourcePropertyNameおよびtargetPropertyNameで識別されるプロパティが存在することを確認します
- 2つのプロパティ間のタイプの互換性をチェックしています
また、文字列でプロパティを指定するとエラーが発生しやすいため、代わりにLinq式と拡張メソッドを使用できます。その後、書く代わりに
あなたは書くことができます
最初の3つは処理できると確信していますが(これらの変更を自由に含めることができます)、Linq式と拡張メソッドを使用して、プロパティ名の文字列を使用せずにコードを記述できるようにする方法がわかりません。
任意のヒント?
リンクにある元のコードは次のとおりです。