この記事を書いた人:@nao-a(nao-aのマイページ – Qiita)
例えばWindowsとMacのアプリをそれぞれ作成しようとすると、それぞれ別々のUIとビジネスロジックを組む必要があると思いますが、以下の弊害があります
macOS側をXamarin.Mac、Windows側をUWPまたはWPFを採用することで、少なくともビジネスロジックをmacOSとWindowsとで共通化することが可能となります
ビジネスロジックの共通化が可能ということは、その分製造や機能改修にかかるコストが下がることになりますし、作り方次第では、UIを触らない場合はUIのことを気にせずコーディングできるようになります
全部Windowsみたいに書けるわけではなく、UIを書く際は Xcode や CocoaAPI の知識が多少必要となります。。。(でも、きっとそんなに難しくないですよ)
Xamarin.Mac初心者がXamarin.Macを使ってファイルのパスを2つの方法で取得するのを試してみました!
Xamarin.Mac初心者向けになるべくハンズオン形式で記載しています(といいながら私も初心者ですが)
この記事ではタイトルを「ドラッグアンドドロップされたファイルのパスを取得する方法!」としていますが、以下の3部構成として記載しています
この記事だけで理解するのが不安でしたら、Microsoft公式の Hello, Mac – チュートリアル を読んでから本記事を読むことをおすすめします。
partial void OnClickButtonFileOpen(Foundation.NSObject sender)
{
var dlg = NSOpenPanel.OpenPanel;
dlg.CanChooseFiles = true;
dlg.CanChooseDirectories = false;
dlg.AllowedFileTypes = new string[] { "txt", "html", "md", "css" };
if (dlg.RunModal() == 1)
{
// Nab the first file
var url = dlg.Urls[0];
if (url != null)
{
var path = url.Path;
labelFilePath.StringValue = path;
}
}
}
public interface DragAndDropViewDelegate
{
/// <summary>
/// ビュー上にファイルがD&Dされた場合に呼ばれる
/// </summary>
/// <param name="files">ファイルパス一覧</param>
void DragAndDropViewGetDraggingFiles(NSArray files);
}
public partial class DragAndDropView : AppKit.NSView
{
/// <summary>
/// マウスドラッグアンドドロップ時のフォーカスフラグ
/// </summary>
private bool _isHighlight = false;
/// <summary>
/// ドラッグアンドドロップされた後の処理を移譲するためのインターフェースオブジェクト
/// </summary>
public DragAndDropViewDelegate Delegate;
#region Constructors
// Called when created from unmanaged code
public DragAndDropView(IntPtr handle) : base(handle)
{
Initialize();
}
// Called when created directly from a XIB file
[Export("initWithCoder:")]
public DragAndDropView(NSCoder coder) : base(coder)
{
Initialize();
}
// Shared initialization code
void Initialize()
{
_isHighlight = false;
RegisterForDraggedTypes(new string[] { NSPasteboard.NSFilenamesType });
}
/// <summary>
/// Viewの描画処理
/// View上にファイルがドラッグされているならば、ハイライトをつける
/// </summary>
/// <param name="dirtyRect"></param>
public override void DrawRect(CGRect dirtyRect)
{
base.DrawRect(dirtyRect);
if (_isHighlight)
{
NSColor.SystemBlueColor.Set();
NSBezierPath.DefaultLineWidth = 5;
}
else
{
NSColor.SystemGrayColor.Set();
NSBezierPath.DefaultLineWidth = 1;
}
NSBezierPath.StrokeRect(Bounds);
}
/// <summary>
/// Viewの境界にファイルがドラッグされるときに呼ばれる
/// 宛先がどのドラッグ操作を実行するのかを示す値を返す必要があります。
/// </summary>
/// <param name="sender"></param>
/// <returns></returns>
public override NSDragOperation DraggingEntered(NSDraggingInfo sender)
{
_isHighlight = true;
NeedsDisplay = true;
return NSDragOperation.Generic;
}
/// <summary>
/// View上にファイルがドラッグで保持されている間、短い間隔毎に呼ばれるメソッド
/// 宛先がどのドラッグ操作を実行するのかを示す値を返す必要があります。
/// </summary>
/// <param name="sender"></param>
/// <returns></returns>
public override NSDragOperation DraggingUpdated(NSDraggingInfo sender)
{
_isHighlight = true;
NeedsDisplay = true;
return NSDragOperation.Generic;
}
/// <summary>
/// View上にファイルがドラッグされなくなった際に呼ばれる
/// </summary>
/// <param name="sender"></param>
public override void DraggingExited(NSDraggingInfo sender)
{
_isHighlight = false;
NeedsDisplay = true;
}
/// <summary>
/// View上でファイルがドロップされた際に呼ばれる
/// メッセージが返された場合はtrue、performDragOperation:メッセージが送信されます。
/// </summary>
/// <param name="sender"></param>
/// <returns></returns>
public override bool PrepareForDragOperation(NSDraggingInfo sender)
{
_isHighlight = false;
NeedsDisplay = true;
return true;
}
/// <summary>
/// View上でファイルがドロップされた後の処理
/// </summary>
/// <param name="sender"></param>
/// <returns></returns>
public override bool PerformDragOperation(NSDraggingInfo sender)
{
NSArray draggedFilenames = (NSArray)sender.DraggingPasteboard.GetPropertyListForType(NSPasteboard.NSFilenamesType);
for (uint i=0; i<draggedFilenames.Count; i++)
{
bool isDir = false;
if (!NSFileManager.DefaultManager.FileExists(draggedFilenames.GetItem<NSString>(i), ref isDir))
{
return false;
}
if (isDir == true)
{
return false;
}
}
return true;
}
/// <summary>
/// 一連のドラッグ操作が完了したときに呼ばれる
/// </summary>
/// <param name="sender"></param>
public override void ConcludeDragOperation(NSDraggingInfo sender)
{
NSArray filePathes = (NSArray)sender.DraggingPasteboard.GetPropertyListForType(NSPasteboard.NSFilenamesType);
Delegate.DragAndDropViewGetDraggingFiles(filePathes);
}
#endregion
}
public partial class ViewController : NSViewController, DragAndDropViewDelegate
public override void ViewDidLoad()
{
base.ViewDidLoad();
// Do any additional setup after loading the view.
dragAndDropView.Delegate = this;
}
public void DragAndDropViewGetDraggingFiles(NSArray files)
{
string pathes = "";
for (uint i=0; i<files.Count; i++)
{
pathes += files.GetItem<NSString>(i) + ", ";
}
labelFilePath.StringValue = pathes;
}
今回のファイルはgithubに公開しています。
こちら
当社で開発している3D・VR・ARアプリケーションの開発エンジニアを募集中です。
詳しい求人内容はバルテスグループ採用サイトをご覧ください。
画像をクリックいただきますと詳しい求人内容をご覧いただけます。
是非フォローや「いいね!」をお願いいたします!
公式アカウントはこちら